javascript,比较不同大小的数组

javascript, compare arrays of different sizes

本文关键字:数组 比较 javascript      更新时间:2023-09-26

有两个大小可能不同的数组,看看它们是否相同的最佳方法是什么

例如

var a1 = [ 1, 2, 3 ];
var a2 = [ 1, 2 ];
var a3 = [ 1, 3 ];
a1 == a2 => true;
a1 == a3 => false;

我确信这已经做了数千次了,语法已经被很好地记住了

这是怎么回事(我只会在a1和a2上演示->我想你可以用它来实现功能):

var min_val = min(a1.length, a2.length);
var equals = true;
for(i = 0; i < min_val; i++)
{
    if(a1[i] != a2[i])
    {
        equals = false;
        break;
    }
}

当然,结果将以equals变量表示。如果您想从中生成函数,只需将a1和a2作为参数传递并返回equals。

function compareArraySeq(a, b) {
    return a.slice(0, b.length).join(' ') == b.slice(0, a.length).join(' ');
}
function compareArraySeq(a1, a2) {
  var i, l = Math.min(a1.length, a2.length); 
  for (i=0; i<l; i++) {
    if (a1[i] !== a2[i]) return false;
  }
  return true;
}

[edit]基于Tomalaks的评论,我认为JSON可以起到拯救作用。

所以,再一次:这里有一个Array扩展,它可以做你想做的事情:

function comparePartial(arr1,arr2){
  var arr2 = this, l1 = arr1.length, l2 = arr2.length;
  return ( l1<1 || l2<1
            ? false :
              JSON.stringify(arr1.slice(0, l2)) ===
              JSON.stringify(arr2.slice(0, l1))
         );
}
Array.prototype.comparePartial = 
    Array.prototype.comparePartial || comparePartial;
//usage
    var a1 = [ 1, 2, 3 ]
   ,a2 = [ 1, 2 ]
   ,a3 = [ 1, 3 ]
   ,a4 = ['','']
   ,a5 = ['','','']
   ,a6 = []
   ,a7 = ['bla','doh',1]
   ,a8 = ['bla','doh',1,'yeah','really']
   ,a9 = [1,3,5,'doh']
   ,a10= ['1','3','5','doh']
   ,a11= [{a:1,b:2},{c:3,d:4}]
   ,a12= [{a:1,b:2},{c:3,d:4},{e:5,f:6}]
console.log(
  [ a1.comparePartial(a2)
   ,a2.comparePartial(a1)
   ,a1.comparePartial(a3)
   ,a4.comparePartial(a5)
   ,a5.comparePartial(a6)
   ,a1.comparePartial(a6)
   ,a8.comparePartial(a7)
   ,a10.comparePartial(a9)  //=> 'type safe' comparison
   ,a11.comparePartial(a12) //=> can compare arrays of Objects
  ].join(' - ')
); //=> true - true - false - true - false - false - true - false - true
function prefixEqual(a, b) {
    var prefixLength = a.length < b.length ? a.length : b.length;
    for(var i = 0; i < prefixLength; i+=1)
        if( a[i] != b[i] )
            return false;
    return true;
}

一次循环检查一个点。我做了这个:

var compare = function (a1, a2) {
    var l = Math.min(a1.length, a2.length);
    for (var i = 0; i < l; i++) {
        if (a1[i] !== a2[i]) {
            return false;
        }
    }
    return true;
}

现在你可以比较这样的数组:

var a = [0, 1, 2, 3];
var b = [0, 1, 2];
var c = [0, 1, 3];
compare(a, b); //true
compare(a, c); //false

希望这对你有用:)

Fiddle链接:http://jsfiddle.net/8zbJj/1/

如果数组是字符串、数字或布尔值,则可以比较它们的String值。

function compareSimpleValues(a,b){
  if(a.length>=b.length)return String(a).indexOf(String(b))===0;
  return String(b).indexOf(String(a))===0;
}