检查合并的数组中是否有两个数组中的项,并更新合并的数组JS

时间:2018-09-28 13:23:41

标签: javascript arrays object lodash

我有两个数组。我将其合并并删除重复项。合并是通过考虑数组的所有键来完成的(数组1中对象的所有键值必须与数组2中的键值匹配)。

var result1 = [{
    name: 'Sandra',
    email: 'sandra@example.com'
  },
  {
    name: 'John',
    email: 'johnny@example.com'
  },
  {
    name: 'Peter',
    email: 'peter@example.com'
  },
  {
    name: 'Bobby',
    email: 'bobby@example.com'
  },
  {
    name: 'Arun',
    email: 'arun@gmail.com'
  },
];

var result2 = [{
    name: 'John',
    email: 'johnny@example.com'
  },
  {
    name: 'Bobby',
    email: 'bobby@example.com'
  },
  {
    name: 'Arun',
    email: 'arun@example.com'
  }
];

var result= _.uniqWith(_.concat(result1, result2), _.isEqual)

现在,我需要将合并数组的每个项目与array1和array2的每个项目进行检查,并更新合并数组是否存在。

所以我的最终结果应该是这样的。

var result = [{
    name: 'Sandra',
    email: 'sandra@example.com',
    presentInA: true,
    presentInB: false
  },
  {
    name: 'John',
    email: 'johnny@example.com',
    presentInA: true,
    presentInB: true
  },
  {
    name: 'Peter',
    email: 'peter@example.com',
    presentInA: true,
    presentInB: false
  },
  {
    name: 'Bobby',
    email: 'bobby@example.com',
    presentInA: true,
    presentInB: true
  },
  {
    name: 'Arun',
    email: 'arun@example.com',
    presentInA: false,
    presentInB: true
  },
  {
    name: 'Arun',
    email: 'arun@gmail.com',
    presentInA: true,
    presentInB: false
  }
];

如何以最好的方式做到这一点?我想可以通过遍历所有3个数组来做到这一点,但这是一个糟糕的方法。

请咨询。

3 个答案:

答案 0 :(得分:2)

您可以在result上方iterate并使用_.some来检查其中的每个对象是否位于result1result2中(并设置相应的属性presentInApresentInB)。像这样:

_.forEach(result, (obj) => {
   let presentInA = _.some(result1, obj);
   let presentInB = _.some(result2, obj);
   obj.presentInA = presentInA;
   obj.presentInB = presentInB;
});

var result1 = [{
    name: 'Sandra',
    email: 'sandra@example.com'
  },
  {
    name: 'John',
    email: 'johnny@example.com'
  },
  {
    name: 'Peter',
    email: 'peter@example.com'
  },
  {
    name: 'Bobby',
    email: 'bobby@example.com'
  },
];

var result2 = [{
    name: 'John',
    email: 'johnny@example.com'
  },
  {
    name: 'Bobby',
    email: 'bobby@example.com'
  },
  {
    name: 'Arun',
    email: 'arun@example.com'
  }
];

var result = _.uniqWith(_.concat(result1, result2), _.isEqual);

_.forEach(result, (obj) => {
   let presentInA = _.some(result1, obj);
   let presentInB = _.some(result2, obj);
   obj.presentInA = presentInA;
   obj.presentInB = presentInB;
});

console.log(result);
<script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.17.10/lodash.js"></script>

答案 1 :(得分:2)

您可以这样做

result.map(
    per => ({
        name: per.name,
        email: per.email,
        presentInA: _.find(
            result1, (o) => o.nombre === per.nombre && o.email === per.email
        ) ? true : false,
        presentInB: _.find(
            result2, (o) => o.nombre === per.nombre && o.email === per.email
        ) ? true : false,
    })
)

答案 2 :(得分:1)

您可以使用哈希表查找和合并重复对象:

 const { result } = merge(result1, "presentInA").merge(result2, "presentInB");

可以用作:

import spacy
nlp = spacy.load('en_core_web_sm')
doc = nlp(text)

即O(n),但假定电子邮件中不包含两个@。