【问题标题】:Get the JSON objects that are not present in another array获取另一个数组中不存在的 JSON 对象
【发布时间】:2018-05-28 11:48:42
【问题描述】:

我有两个数组。

array1 = [
 {'id':1},
 {'id': 2}
]

array2 = [
 {'idVal':1},
 {'idVal': 2},
 {'idVal': 3},
 {'idVal': 4}
]

我需要一个最佳方法,如果可能的话,lodash 以便我可以比较这两个数组并获得一个结果数组,该数组的对象存在于array2 而不是array1。两个数组中的键具有不同的名称。所以结果会是,

res = [
  {'idVal': 3},
  {'idVal': 4}
]

【问题讨论】:

    标签: javascript jquery html web lodash


    【解决方案1】:
    array1 = [
     {'id':1},
     {'id': 2}
    ]
    
    array2 = [
     {'idVal':1},
     {'idVal': 2},
     {'idVal': 3},
     {'idVal': 4}
    ]
    
    var array1Keys=array1.map(function(d1){ return d1.id});
    
    var result =array2.filter(function(d){ return array1Keys.indexOf(d.idVal)==-1 })
    console.log(result);
    

    【讨论】:

      【解决方案2】:

      这是一个优化的解决方案,但不使用 lodash。我创建了一个仅包含 array1 值的搜索索引,这样您就可以在 O(1) 中查找元素,而不是为 array2 中的每个元素查找整个 array1

      marray1 的大小,narray2 的大小。此解决方案将在 O(m+n) 中运行,而不是在没有事先索引的情况下运行的 O(m*n)

      const array1 = [
       {'id':1},
       {'id': 2}
      ];
      
      const array2 = [
       {'idVal':1},
       {'idVal': 2},
       {'idVal': 3},
       {'idVal': 4}
      ];
      
      const array1ValuesIndex = {};
      array1.forEach(entry => array1ValuesIndex[entry.id] = true);
      
      const result = array2.filter(entry => !array1ValuesIndex[entry.idVal]);
      console.log(result);

      【讨论】:

        【解决方案3】:

        使用 ES6

        const result = array2.filter(item => !array1.find(i => i.idVal === item.id))
        

        【讨论】:

          【解决方案4】:

          var array1 = [
           {'id':1},
           {'id': 2},
           {'id': 3},
           {'id': 4}
          ]
          
          var array2 = [
           {'id':1},
           {'id': 3},
           {'id': 4}
          ]
          
          notInArray2 = array1.reduce( function(acc, v) {
            if(!array2.find(function (vInner) {
              return v.id === vInner.id;
            })){
              acc.push(v);
            }
            return acc
          }, []);
          
          console.log(JSON.stringify(notInArray2))

          【讨论】:

            【解决方案5】:

            _.differenceWith() 与比较器方法一起使用。根据关于_.difference() 的文档(differenceWith 基于差异):

            创建一个不包含在另一个给定值中的数组值数组 使用 SameValueZero 进行相等比较的数组。顺序和 结果值的引用由第一个数组确定。

            所以array2 应该是传递给方法的第一个参数。

            var array1 = [
              {'id': 1},
              {'id': 2}
            ];
            
            var array2 = [
              {'idVal': 1},
              {'idVal': 2},
              {'idVal': 3},
              {'idVal': 4}
            ];
            
            var result = _.differenceWith(array2, array1, function(arrVal, othVal) {
              return arrVal.idVal === othVal.id;
            });
            
            console.log(result);
            <script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.17.4/lodash.min.js"></script>

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2021-08-07
              • 2018-11-23
              • 1970-01-01
              • 2017-02-21
              • 1970-01-01
              相关资源
              最近更新 更多