匹配对象数组中的对象并删除

时间:2017-02-01 10:08:03

标签: javascript ecmascript-6 underscore.js

在解决这个问题2天后,我希望有人可以帮助我。

我有两个对象数组,如下所示:

newRecords

我正在尝试使用一个返回命名变量的函数,该变量包含已添加的数据列表(存在于oldRecords但不存在于oldRecords中)以及已删除的数据列表(存在newRecords但不存在于const analyse = (older, newer) => { let added, removed; // ... magic return {added, removed} } const {added, removed} = analyse(oldRecords, newRecords); 中)。

例如

reject

我不会发布我在这个函数中尝试的所有代码,因为我试图映射,减少并遍历两个数组,在过去48小时内创建临时数组,现在我可以填写一本书了我已经编写并删除了代码。我还使用了find / findWhere / var oldRecords = [1, 3]; var newRecords = [1, 2, 4] function analyse (old, newer) { let added = []; let removed = []; old.reduce((o) => { added = added.concat(_.reject(newer, (num) => num === o )); }); newer.reduce((n) => { removed = _.reject(old, (num) => num === n ); }); return {added, removed} } const {added, removed} = analyse(oldRecords, newRecords); 这样的underscore.js方法,这些方法让我很接近,但没有雪茄。

我遇到的主要问题是因为数组包含对象,如果它们包含数字则非常容易,即

JSON.stringify

如何实现上述目标,但对象不是数组?

n.b。我尝试修改上述内容并使用keys,但它并没有真正起作用。

编辑:重要的一点,我忘了添加,它的key对象结构是动态的,它们来自数据库,因此任何单独检查{{{ 1}}也必须是动态的,即不是硬编码值

3 个答案:

答案 0 :(得分:2)

您可以使用rejectsome来检查是否包含在相应的集合中。 isEqual函数用于检查处理动态密钥的相等性:

const analyse = (older, newer) => {
  let added = _.reject(newer, n => _.some(older, o =>_.isEqual(n, o)));
  let removed = _.reject(older, o => _.some(newer, n => _.isEqual(n, o)));

  return {added, removed}
}

答案 1 :(得分:0)

你可以试试这个:

const analyse = (older, newer) => {
   let removed = older.filter(newItem => {
     return newer.filter(oldItem => {
        return _.isEqual(newItem, oldItem);
     }).length === 0
   });

   let added = newer.filter(oldItem => {
     return older.filter(newItem => {
        return _.isEqual(newItem, oldItem);
     }).length === 0
   });

   return {added, removed};
}

答案 2 :(得分:0)

您可以先创建函数来检查两个对象是否相等,然后结束然后使用filter()some()返回结果。

let oldRecords = [
  {name: 'john'},
  {name: 'ringo'}
];

let newRecords = [
  {name: 'paul'},
  {name: 'john'},
  {name: 'stuart'}
];


function isEqual(o1, o2) {
  return Object.keys(o1).length == Object.keys(o2).length &&
    Object.keys(o1).every(function(key) {
      return o2.hasOwnProperty(key) && o1[key] == o2[key]
    })
}

var result = {}
result.removed = oldRecords.filter(e => !newRecords.some(a => isEqual(e, a)))
result.added = newRecords.filter(e => !oldRecords.some(a => isEqual(e, a)))
console.log(result)