【问题标题】:Filter Array Not in Another Array过滤数组不在另一个数组中
【发布时间】:2015-11-07 00:51:51
【问题描述】:

需要根据另一个数组过滤一个数组。淘汰赛中是否有 util 功能?否则我需要使用 javascript

第一:

var obj1 = [{
    "visible": "true",
    "id": 1
}, {
    "visible": "true",
    "id": 2
}, {
    "visible": "true",
    "id": 3
}, {
    "Name": "Test3",
    "id": 4
}];

第二:

var obj2 = [ 2,3]

现在我需要根据 obj2 过滤 obj1 并返回 obj1 中不在 obj2 中的项目 省略上述数据中的 2,3(对象 1 的比较 Id

输出:

[{
    "visible": "true",
    "id": 1
}, {
    "Name": "Test3",
    "id": 4
}];

【问题讨论】:

    标签: javascript knockout.js


    【解决方案1】:

    您可以简单地使用filter 运行obj1 并在obj2 上使用indexOf 来查看它是否存在。如果值不在数组中,indexOf 返回 -1,当回调返回 true 时,filter 包含该项。

    var arr = obj1.filter(function(item){
      return obj2.indexOf(item.id) === -1;
    });
    

    使用更新的 ES 语法和 API,它变得更简单:

    const arr = obj1.filter(i => !obj2.includes(i.id))
    

    【讨论】:

      【解决方案2】:

      即使@Joseph 提供的答案很好,但如果您的数组非常大,也会导致性能问题。复杂度为O(n^2),但可以提高到O(n)。下面是我用来执行此任务的代码:

      //create a map for storing object id
      const map = new Map();
      //add existing id from the array to the map
      for (item of obj2) {
        map.set(item.id, true);
      }
      
      //create a new array that contains all items that aren't included in the //map
      //the map lookUp is O(1) complexity
      const arr = obj1.filter(item => !map[item.id]);
      

      通过这种方式我们避免了嵌套迭代并且具有 O(n) 复杂度

      【讨论】:

        【解决方案3】:

        要创建输出数组,请创建一个函数,该函数将遍历 obj1,并根据迭代中每个 obj 的 id 是否存在于 obj2 中填充一个新数组。

        var obj1 = [{
            "visible": "true",
            "id": 1
        }, {
            "visible": "true",
            "id": 2
        }, {
            "visible": "true",
            "id": 3
        }, {
            "Name": "Test3",
            "id": 4
        }];
        
        var obj2 = [2,3]
        
        var select = function(arr) {
          var newArr = [];
          obj1.forEach(function(obj) {
            if obj2.indexOf(obj.id) !== -1 {
              newArr.push(obj)
            };
          };
          return newArr;
        };
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2017-05-08
          • 2017-09-16
          相关资源
          最近更新 更多