使用jQuery比较两个Javascript对象数组

Meg*_*att 91 javascript arrays jquery compare object

我有两个JavaScript对象数组,我想比较它们是否相同.对象可能不会(并且很可能不会)在每个数组中具有相同的顺序.每个数组不应超过10个对象.我认为jQuery可能有一个优雅的解决方案来解决这个问题,但我无法在网上找到太多.

我知道一个粗暴的嵌套$.each(array, function(){})解决方案可以工作,但是有没有我不知道的内置函数?

谢谢.

Sud*_*r R 276

有一个简单的方法......

$(arr1).not(arr2).length === 0 && $(arr2).not(arr1).length === 0
Run Code Online (Sandbox Code Playgroud)

如果以上返回true,则即使元素的顺序不同,两个数组也是相同的.

注意:这仅适用于使用JSON对象时jquery版本<3.0.0

  • +1,但是当你将一个数组与一个包含相同属性的Object进行比较时,它等于true,f.ex` [0,1] == {0:0,1:1,length = 2} (12认同)
  • @Alexxus,你需要两个比较,因为`not`是一个过滤函数,而不是一个相等的函数.用`[1,2]`和`[1]`来试试吧.在一个顺序中,你会得到`[]`,而在另一个顺序中,你会得到`[2]`. (10认同)
  • 为什么`$(arr1).not(arr2).length == 0`还不够? (4认同)
  • 请注意,如果数组中有重复项,则返回true.所以类似:`[1,1,2,2,3,3] == [1,2,3]`是真的. (3认同)
  • 从3.0.0-rc1开始,jQuery`not`不再适用于通用对象.请参阅https://github.com/jquery/jquery/issues/3147 (3认同)

Ane*_*pic 35

我今天也在寻找这个并找到:http: //www.breakingpar.com/bkp/home.nsf/0/87256B280015193F87256BFB0077DFFD

不知道这是否是一个很好的解决方案,尽管他们确实提到了一些考虑的性能因素.

我喜欢jQuery帮助器方法的想法.@David我宁愿看你的比较方法如下:

jQuery.compare(a, b)
Run Code Online (Sandbox Code Playgroud)

我对自己没有意义:

$(a).compare(b)
Run Code Online (Sandbox Code Playgroud)

其中a和b是数组.通常当你$(某事物)时,你会传递一个选择器字符串来处理DOM元素.

还有关排序和"缓存"排序数组:

  • 我不认为在方法开始时排序一次而不是每次循环都是"缓存".每次调用compare(b)时仍会发生排序.那只是语义,但......
  • for(var i = 0; t [i]; i ++){ ...如果你的t数组在某处包含一个假值,那么这个循环会提前结束,所以$([1,2,3,4]).compare( [1,false,2,3]返回true!
  • 更重要的是阵列sort()方法排序数组的地方,这样做VAR B = t.sort() ......不创建原始数组的排序副本,它的排序阵列,并分配一个参考,以它在b.我不认为比较方法应该有副作用.

我们需要做的是在处理数组之前复制数组.对于如何以jQuery方式执行此操作,我能找到的最佳答案是John Resig在这里!在JavaScript中深度克隆对象的最有效方法是什么? (请参阅有关对象克隆配方的数组版本的答案的评论)

在这种情况下,我认为它的代码是:

jQuery.extend({
    compare: function (arrayA, arrayB) {
        if (arrayA.length != arrayB.length) { return false; }
        // sort modifies original array
        // (which are passed by reference to our method!)
        // so clone the arrays before sorting
        var a = jQuery.extend(true, [], arrayA);
        var b = jQuery.extend(true, [], arrayB);
        a.sort(); 
        b.sort();
        for (var i = 0, l = a.length; i < l; i++) {
            if (a[i] !== b[i]) { 
                return false;
            }
        }
        return true;
    }
});

var a = [1, 2, 3];
var b = [2, 3, 4];
var c = [3, 4, 2];

jQuery.compare(a, b);
// false

jQuery.compare(b, c);
// true

// c is still unsorted [3, 4, 2]
Run Code Online (Sandbox Code Playgroud)

  • 实际上我可能会将这个方法命名为'arrayCompare'而不是'compare',因为这是它唯一可以设计用于... (2认同)

Kwe*_*wex 14

我的方法完全不同 - 我使用JSON.stringify将两个集合展平,并使用普通的字符串比较来检查是否相等.

var arr1 = [
             {Col: 'a', Val: 1}, 
             {Col: 'b', Val: 2}, 
             {Col: 'c', Val: 3}
           ];

var arr2 = [
             {Col: 'x', Val: 24}, 
             {Col: 'y', Val: 25}, 
             {Col: 'z', Val: 26}
           ];

if(JSON.stringify(arr1) == JSON.stringify(arr2)){
    alert('Collections are equal');
}else{
    alert('Collections are not equal');
}
Run Code Online (Sandbox Code Playgroud)

注意:请注意,他的方法假定两个集合都以类似的方式排序,如果没有,它会给你一个错误的结果!


gms*_*msi 12

将两个数组转换为字符串并进行比较

if (JSON.stringify(array1) == JSON.stringify(array2))
{
    // your code here
}
Run Code Online (Sandbox Code Playgroud)