javascript,比较不同大小的数组

javascript,比较不同大小的数组,javascript,arrays,Javascript,Arrays,对于两个可能大小不同的数组,最好的方法是什么来确定它们是否完全相同 比如说 var a1 = [ 1, 2, 3 ]; var a2 = [ 1, 2 ]; var a3 = [ 1, 3 ]; a1 == a2 => true; a1 == a3 => false; 我敢肯定这已经做了数千次,语法也被很好地记住了,那么这个呢(我将在a1和a2上演示->我想你可以利用它来实现功能): var min\u val=min(a1.长度,a2.长度); var等于真; 对于(i=0;i

对于两个可能大小不同的数组,最好的方法是什么来确定它们是否完全相同

比如说

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

a1 == a2 => true;
a1 == a3 => false;
我敢肯定这已经做了数千次,语法也被很好地记住了,那么这个呢(我将在a1和a2上演示->我想你可以利用它来实现功能):

var min\u val=min(a1.长度,a2.长度);
var等于真;
对于(i=0;i
当然,结果是相等的。如果你想利用这个函数,只需将a1和a2作为参数传递,并返回等于。

函数comparararayseq(a1,a2){
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;
}
变量i,l=数学最小值(a1.长度,a2.长度); 对于(i=0;i
函数prefixEqual(a,b){
可变前桥长度=a.长度
一次循环检查一个点。 我已作出以下声明:

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;
}
希望这对你有用:)

Fiddle链接:

[edit]根据评论,我认为JSON可以起到解救作用

同样,这里有一个数组扩展,它完成了[我想]您想要做的事情:

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
函数比较部分(arr1、arr2){
var arr2=this,l1=arr1.length,l2=arr2.length;
返回(l1可以比较对象数组
].join(“-”)
);//=>真-真-假-真-假-假-真-假-真-假-真

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

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

为什么第一个是真的,第二个是假的?为什么
al
&
a2
是一样的?因为
a2
的内容在
a1
中是真的,它解决了这个问题,但是认为使用slice etc可以在不创建函数的情况下完成它。与slice解决方案不同,这也适用于非标量值,即对象数组。非常漂亮聪明。可以在不使用函数def的情况下使用这种方法,但键入太多。那么可能是数组扩展是个好主意吗?@KooiInc请参阅我的注释。将数组转换为字符串并不能解决问题。@Tomalak:yep。将我的答案替换为comparison@KooiInc也许效率不算太高,但作为交换,它的简单和高效s表示嵌套数据。+1输出!!不需要函数调用!输入开销不算太大。@c如果空字符串数组元素失败,则不应使用它。@Tomalak-使用空数组正确测试-缺少所说内容-您能举个例子吗?thanks@Tomalak-非常好。这种情况下肯定会失败。这是po使用join(“”)可以解决这个问题。在答案中更改了这一点。@ccyoung“当星星对齐时”是一种注定要失败的编程方式。
var a = [0, 1, 2, 3];
var b = [0, 1, 2];
var c = [0, 1, 3];

compare(a, b); //true
compare(a, c); //false
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 compareArraySeq(a, b) {
    return a.slice(0, b.length).join(' ') == b.slice(0, a.length).join(' ');
}
function compareSimpleValues(a,b){
  if(a.length>=b.length)return String(a).indexOf(String(b))===0;
  return String(b).indexOf(String(a))===0;
}