简单的问题,但我不知道如何解决它
我有几个数组,但我只想要所有数组共有的值
我正在使用javascript。
答案 0 :(得分:2)
答案 1 :(得分:2)
这样的事情应该有效:
function getCommonElements() {
var common = [],
i, j;
if (arguments.length === 0)
return common;
outerLoop:
for (i = 0; i < arguments[0].length; i++) {
for (j = 1; j < arguments.length; j++)
if (-1 === arguments[j].indexOf(arguments[0][i]))
continue outerLoop;
common.push(arguments[0][i]);
}
return common;
}
使用任意数量的数组作为参数调用它:
var commonEls = getCommonElements(arr1, arr2, arr3, etc);
如果不明显,那么我们的想法是从第一个参数循环遍历数组,并针对其他数组测试每个元素。一旦发现不的特定元素在其他任何其他数组中,就继续使用下一个元素。否则,将当前元素添加到输出数组common
。
如果您需要支持不支持Array.indexOf()
method的浏览器(IE&lt; 9),您可以添加shim shown at the MDN page或将.indexOf()
测试替换为我的代码循环。
答案 2 :(得分:0)
我认为这应该有用。
var arr1 = [1,2,3,4]
, arr2 = [2,3,4,5]
, arr3 = [3,4,5,6]
, arrs = [arr1, arr2, arr3];
var all = arr1.concat(arr2.concat(arr3)).sort()
, red1 = all.filter(
function(val, i, arr) {
return i === arr.lastIndexOf(val)-1;
})
, red2 = red1.filter(
function(val, i, arr) {
var shared = true;
arrs.forEach(
function(arr, i, src) {
if (arr.indexOf(val) === -1)
shared = false;
})
return shared;
})
答案 3 :(得分:0)
如果您只关心支持reduce()的现代浏览器,请使用此解决方案:
Finding matches between multiple JavaScript Arrays
如果您必须支持IE6,请使用下面的解决方案。以下是我使用jQuery在IE6中使用它的方法:
// Find common values across all arrays in 'a',
// where 'a' is an array of arrays [[arr1], [arr2], ...]
Object.common = function(a) {
var aCommon = [];
for (var i=0,imax=a[0].length,nMatch,sVal; i<imax; i++) {
nMatch = 0;
sVal = a[0][i];
for (var j=1,jmax=a.length; j<jmax; j++) {
nMatch += ($.inArray(sVal, a[j])>-1) ? 1 : 0;
}
if (nMatch===a.length-1) aCommon.push(sVal);
}
return aCommon;
}
基本上,你只需循环遍历'a'中第一个数组的每个值,看它是否存在于其他数组中。如果存在,则增加nMatch,并在扫描其他数组后,如果nMatch等于其他数组的总数,则将值添加到aCommon数组。
使用Florian Salihovic提供的样本数据,Object.common(arrs)
将返回[3, 4]
。
如果你不能使用jQuery,那么用Mozilla提供的代码替换$ .inArray():
https://developer.mozilla.org/en-US/docs/JavaScript/Reference/Global_Objects/Array/IndexOf