【问题标题】:javascript remove array from arrayjavascript 从数组中删除数组
【发布时间】:2011-10-06 01:39:42
【问题描述】:

假设我们有以下数组:

a = [1, 2, 3, 4, 5]

b = [2, 3]

如何从 a 中减去 b?这样我们就有了c = a - b,它应该等于[1, 4, 5]。 jQuery 解决方案也可以。

【问题讨论】:

    标签: javascript jquery arrays


    【解决方案1】:

    假设您使用的是具有 Array.prototype.filterArray.prototype.indexOf 的浏览器,您可以使用这个:

    var c = a.filter(function(item) {
        return b.indexOf(item) === -1;
    });
    

    如果有问题的浏览器没有这些方法,您可以填充它们。

    【讨论】:

    • Btw IE8 是市场上唯一没有实现这些方法的相关浏览器...来源:kangax.github.com/es5-compat-table
    • @Kakashi:对我有用。你用的是什么版本?
    • 请注意,上面的链接包含 filter 和 indexOf 的垫片。
    【解决方案2】:

    这是@icktoofay 发布的答案的修改版本。

    在 ES6 中我们可以使用:

    这会将我们的代码简化为:

    var c = a.filter(x => !b.includes(x));
    

    演示:

    var a = [1, 2, 3, 4, 5];
    var b = [2, 3];
    
    var c = a.filter(x => !b.includes(x));
    console.log(c);

    【讨论】:

      【解决方案3】:

      对于适用于所有浏览器的代码,您必须手动从 a 中的 b 中查找每个元素并将其删除。

      var a = [1, 2, 3, 4, 5];
      var b = [2, 3];
      
      var result = [], found;
      for (var i = 0; i < a.length; i++) {
          found = false;
          // find a[i] in b
          for (var j = 0; j < b.length; j++) {
              if (a[i] == b[j]) {
                  found = true;
                  break;
              }
          }
          if (!found) {
              result.push(a[i]);
          }
      }
      // The array result now contains just the items from a that are not in b
      

      这里的工作示例:http://jsfiddle.net/jfriend00/xkBzR/

      而且,这里有一个版本对于大型数组可能更快,因为它将所有内容都放入一个对象中以进行散列查找而不是暴力数组搜索:

      var a = [1, 2, 3, 4, 5];
      var b = [2, 3];
      
      function filterArray(src, filt) {
          var temp = {}, i, result = [];
          // load contents of filt into object keys for faster lookup
          for (i = 0; i < filt.length; i++) {
              temp[filt[i]] = true;
          }
      
          // go through src
          for (i = 0; i < src.length; i++) {
              if (!(src[i] in temp)) {
                  result.push(src[i]);
              }
          }
          return(result);
      }
      
      var filtered = filterArray(a, b);
      

      这里的工作示例:http://jsfiddle.net/jfriend00/LUcx6/

      【讨论】:

      • 为什么不实现Array.filter方法?在其他情况下也可能有用。
      • Array.filter() 很有用——我只是提供一个替代方案。有些人不想向现有核心对象添加方法,或者如果这样做,他们的代码可能会中断。
      【解决方案4】:

      对于那些在对象上苦苦挣扎的人,比如 Date,你会发现两个不同的对象永远不会彼此相等,即使它们具有相同的值,所以上面的答案是行不通的。 这是 ES6 中这个问题的答案。

      const c = a.filter(aObject => b.findIndex(bObject => aObject.valueOf() === bObject.valueOf()) === -1)
      

      【讨论】:

        【解决方案5】:

        这里的 try 实现适用于所有浏览器:

        if('filter' in Array == false) {
            Array.prototype.filter = 
                function(callback) {
                    if(null == this || void 0 == this) {
                        return;
                     }
                    var filtered = [];
                    for(i = 0, len = this.length; i < len; i++) {
                            var tmp = this[i];
                            if(callback(tmp)) {
                                filtered.push(tmp);
                             }
                     }
                        return filtered;
               }
          }
        
        a = [1, 2, 3, 4, 5]; 
        b = [2, 3]; 
        
        var c = a.filter(function(item) { /*implementation of icktoofay */
            return b.indexOf(item) === -1;
        });
        

        【讨论】:

        • Array.indexOf 也不存在于所有浏览器中(例如,在 IE9 之前的任何版本的 IE 中都不存在。)
        【解决方案6】:

        可能是一个过时的查询,但我认为这可能对某人有用。

        let first = [1,2,3,4,5,6,7,9];
        let second = [2,4,6,8];
        const difference = first.filter(item=>!second.includes(item));
        console.log(difference);//[ 1, 3, 6,7]
        /*
        the above will not work for objects with properties
        This might do the trick
        */
        const firstObj = [{a:1,b:2},{a:3,b:4},{a:5,b:6},{a:7,b:8}]//not ideal. I know
        const secondObj = [{a:3,b:4},{a:7,b:8}]
        
        const objDiff = firstObj.filter(obj=>
          !secondObj.find(sec=>//take note of the "!"
            sec.a===obj.a
            &&//or use || if you want to check for either or
            sec.b===obj.b
          )//this is formatted so that it is easily readable
        );
        console.log(objDiff)/*
        [
          {
            "a": 1,
            "b": 2
          },
          {
            "a": 5,
            "b": 6
          }
        ]
        */

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2012-05-03
          • 1970-01-01
          • 2012-08-02
          • 2012-03-10
          • 1970-01-01
          • 2015-01-28
          相关资源
          最近更新 更多