【问题标题】:Removing arrays from other arrays [duplicate]从其他数组中删除数组[重复]
【发布时间】:2014-07-19 00:56:59
【问题描述】:

假设我有这个数组:

a = [
    [2823832908, 10071920], 
    [5384625228, 10924221], 
    [8488934028, 313411415], 
    [2823828588, 10071580], 
    [5224682868, 14919881], 
    [8155986228, 560217208], 
    [3458951628, 10071570], 
    [6382592388, 25064430], 
    [5021452668, 10924221], 
    [8827673748, 59397160], 
    [8647215588, 26343621]
]

还有这个数组:

b = [
    [8488934028, 313411415], 
    [8647215588, 26343621]
]

如何获得一个新数组,其中包含数组a 中不在数组b 中的值,或者如何从数组a 中删除数组b 中的值?

【问题讨论】:

标签: javascript arrays


【解决方案1】:
  1. 创建一个空的结果数组。
  2. 遍历a,选择其当前元素,即[2823832908, 10071920]

  3. 比较当前元素是否相等与 b 的每个元素,比较相等 您可以使用 JSON.stringify 或 .join 来创建数组的字符串表示形式。

  4. 如果当前元素与b的任何元素都不匹配,则将其附加到结果数组中。

  5. 重复。

  a = [
                [2823832908, 10071920], 
                [5384625228, 10924221], 
                [8488934028, 313411415], 
                [2823828588, 10071580], 
                [5224682868, 14919881], 
                [8155986228, 560217208], 
                [3458951628, 10071570], 
                [6382592388, 25064430], 
                [5021452668, 10924221], 
                [8827673748, 59397160], 
                [8647215588, 26343621]
];
    b = [
        [8488934028, 313411415], 
        [8647215588, 26343621]
    ]; 


    var result = [];
    a.forEach(
        function(elem,idx,arr)
        {
            var sig = JSON.stringify(elem);
            var match = false;
            for(var i=0;i<b.length;i++)
            {
                if(sig == JSON.stringify(b[i]))
                   {
                     match = true;
                     break;
                   }
            }
            if(match === false)
                {
                    result.push(elem);
                }
        }
        );

     console.log(result);  

演示http://jsfiddle.net/Ag39M/4/

【讨论】:

  • 这是一个很好的答案,但值得注意的是JSON.stringify 不是比较数组的好方法。 See the comparison in our methods' performance for why.
  • @lonesomeday 感谢您的性能分析。是的,OP 可以使用更优化的方法来比较数组。我使用 JSON.stringify 假设输入较小且简单。
【解决方案2】:

这有点棘手,主要是因为两个数组在 Javascript 中并不相等,即使它们具有完全相同的键。

您必须手动比较它们,例如与this function by Tim Down

然后您必须遍历第一个数组中的值并将它们与第二个数组中的每个值进行比较。

代码可能如下所示:

var filtered = [];

// loop through every element in a
a.forEach(function(elA) {
    // loop through every element in b
    // if the elA is identical to any elB, some will immediately return true
    // if elA is not identical to any elB, it will return false
    var found = a.some(function(elB) {
        return arraysIdentical(elA, elB);
    });

    // if we didn't find any equal ones, we'll add elA to the filtered array
    if (!found) {
        filtered.push(elA);
    }
});

请注意,这依赖于Array#forEachArray#some。如果您需要支持旧版浏览器,则需要使用这些链接中的 polyfill 代码填充它们。

【讨论】:

    【解决方案3】:

    这是一个使用undescore.js 的实现。

    function diff(a1, a2) {
      return _.filter(a1, function(e1) {
        return !_.some(a2, function(e2) {
          return _.isEqual(e1, e2);
        });
      });
    }
    

    例子:

    var a = [ [ 1, 2 ], [ 3, 4 ], [ 5, 6, 7 ], [ 8 ], [ 9 ] ];
    var b = [ [ 1, 2 ], [ 8 ], [ 9 ] ];
    
    console.log(diff(a, b));
    // [ [ 3, 4 ], [ 5, 6, 7 ] ]
    

    【讨论】:

      【解决方案4】:
      function arra_diff(a, b)
      {
        var arr=[], diff=[];
        for(var i=0;i<a.length;i++)
          arr[a[i]]=true;
        for(var i=0;i<b.length;i++)
          if(arr[b[i]]) delete arr[b[i]];
          else arr[b[i]]=true;
        for(var k in arr)
          diff.push(k);
        return diff;
      }
      

      function arra_diff(d, c) { /* d=a,c=b */
          for (var b = [], e = [], a = 0; a < d.length; a++) {
              b[d[a]] = !0;
          }
          for (a = 0; a < c.length; a++) {
              b[c[a]] ? delete b[c[a]] : b[c[a]] = !0;
          }
          for (var f in b) {
              e.push(f);
          }
          return e;
      };
      

      【讨论】:

      • 我投了反对票不是因为它是错误的,而是因为它不可读且未注释,因此不是一个好的 StackOverflow 答案。
      猜你喜欢
      • 2019-07-19
      • 2017-12-16
      • 2019-10-19
      • 2015-11-07
      • 2020-02-11
      • 2019-08-22
      • 2011-06-29
      • 2021-08-28
      相关资源
      最近更新 更多