0

简单的问题,但我不知道如何解决

我有几个数组,但我只想要所有数组共有的值

我正在使用 JavaScript。

4

4 回答 4

2

尝试使用 查找每个数组中的值indexOF

我从来不知道 IE 不支持,但这是这篇文章indexOf的快速修复。

于 2012-05-31T22:45:17.383 回答
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()方法的浏览器(IE < 9),您可以包含MDN 页面上显示的 shim,或者将.indexOf()我的代码中的测试替换为另一个循环。

于 2012-05-31T23:20:30.737 回答
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;
        })
于 2012-05-31T23:14:07.940 回答
0

如果您只关心支持 reduce() 的现代浏览器,请使用以下解决方案:

查找多个 JavaScript 数组之间的匹配项

如果您必须支持 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,则将 $.inArray() 替换为 Mozilla 提供的代码:

https://developer.mozilla.org/en-US/docs/JavaScript/Reference/Global_Objects/Array/IndexOf

于 2013-01-23T10:11:05.790 回答