如何使用jQuery查找存在于多个数组中的对象

4

我有五个数组,它们可能包含相同的值。

var arr1 = ['1','2','3','4'];
var arr2 = ['1','3']
var arr3 = ['1','2','3']
var arr4 = ['1','2','3','4','5'];
var arr5 = ['1','3','4']

如何使用jQuery查找所有数组中都存在的数字?

数字13都出现在所有数组中吗?


你的数组已经排序了吗? - bugwheels94
你的意思是像这样 array intersection 吗? - Stryner
@Ankit 数组未排序。 - Jonathan Kittell
4个回答

3

看看这个

通过重复元素过滤数组

JsFiddle http://jsfiddle.net/nWjcp/87/

var arr1 = ['1','2','3','4'];
var arr2 = ['1','3']
var arr3 = ['1','2','3']
var arr4 = ['1','2','3','4','5'];
var arr5 = ['1','3','4']

var arrays = [
   arr1,arr2,arr3,arr4,arr5
    ];


var result = arrays.shift().filter(function(v) { // Filtering
    return arrays.every(function(a) {       // Seek duplicate
        return a.indexOf(v) !== -1;    
    });
});




   alert( JSON.stringify(result,null,4) ); // ['1','3']

这是更好的方式。 - Etheryte
为什么要用 null 和 4?是为了让事情更难理解吗?它对答案有贡献吗?更不用说每个+filter+indexOf都需要 polyfills。 - Royi Namir
1
只有在需要支持IE8的情况下,你才需要为几乎所有东西提供一个polyfill。 - Etheryte

2

首先,让我们创建一个更易于处理的数据集:

var arrays = [
    ['1', '2', '3', '4'],
    ['1', '3'],
    ['1', '2', '3'],
    ['1', '2', '3', '4', '5'],
    ['1', '3', '4']
];

接下来,我们需要获取所有唯一的元素:

var elements = [].concat.apply([], arrays).filter(function(value, index, self) {
    return self.indexOf(value) === index;
}); //["1", "2", "3", "4", "5"]

最后,将这个集合与我们的所有数组进行比对,只保留出现在所有数组中的元素:

var out = elements.filter(function(item) {
    return arrays.reduce(function(present, array) {
        present = present && (array.indexOf(item) !== -1);
        return present;
    }, true);
}); //["1", "3"]

1
我不喜欢使用没有跨浏览器支持的方法:
这里有一个简单的解决方案,没有使用“额外”的非jQuery包含函数(every、inArray、filter(array)):
var arr1 = ['1','2','3','4'];
var arr2 = ['1','3']
var arr3 = ['1','2','3']
var arr4 = ['1','2','3','4','5'];
var arr5 = ['1','3','4']

var arrs = [arr1,arr2,arr3,arr4,arr5];

var obj={};

$.each(arrs,function (i,arr){
     $.each(arr,function (j,n){
      obj[n]=(+obj[n] || 0) + 1;
     });
});


for (item in obj) 
{  
     if(obj.hasOwnProperty(item ) && obj[item]==arrs.length) console.log(item) //1,3
}

0
在这里找到一个长期的解决方案。首先,让我们找到项数最少的数组,以便优化搜索:

var arr1 = ['1','2','3','4'];
var arr2 = ['1','3', '8'];
var arr3 = ['1','2','3'];
var arr4 = ['1','2','3','4','5'];
var arr5 = ['1','3','4'];

var arrayOfArray = [arr1, arr2, arr3, arr4, arr5];
var arrayWithMin = null;
var outputArray = [];
$.each(arrayOfArray, function(index, arrayItem) {
    arrayWithMin = (arrayWithMin == null) ? arrayItem : (arrayWithMin.length > arrayItem.length ? arrayItem : arrayWithMin);
});

$.each(arrayWithMin, function(i, searchItem) {
    if($.inArray(searchItem, arr1) > -1 
       && $.inArray(searchItem, arr2) > -1 
       && $.inArray(searchItem, arr3) > -1 
       && $.inArray(searchItem, arr4) > -1
       && $.inArray(searchItem, arr5) > -1) {
        outputArray.push(searchItem);
    }
});

document.write(outputArray.join(', '));
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.11.1/jquery.min.js"></script>


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接