如何筛选出数组之间的匹配项,并添加其他键/值?

时间:2019-03-22 16:46:07

标签: javascript arrays

我有2个包含对象的数组。每个对象都有一个“颜色”和“数字”的键/值对。我想对照这两个数组来查找与“数字”匹配的对象。找到这个之后,我想向原始数组中的所有对象添加一个键值对。

我有下面的示例,我相信它是在正确的轨道上,但是正在努力寻找方法。

基本上,如果对象匹配,我想将“ match”的K / V对更改为true或false。

const array1 = [ {color: 'red', number: 1, match: ''}, {color: 'red', number: 2, match: ''}, {color: 'red', number: 3, match: ''} ]
const array2 = [ {color: 'red', number: 3, match: ''}, {color: 'blue', number: 5, match: ''}, {color: 'blue', number: 6, match: ''} ]

async function findMatchingObjects(array1, array2){
    const matchCheck = array1.filter(matchedObj => array2.includes(matchedObj));
  console.log(matchCheck);
}

findMatchingObjects(array1, array2);

预期输出为:

const array3 = [{
  color: 'red',
  number: 1,
  match: 'false'
}, {
  color: 'red',
  number: 2,
  match: 'false'
}, {
  color: 'red',
  number: 3,
  match: 'true'
},
{
  color: 'red',
  number: 3,
  match: 'true'
}, {
  color: 'blue',
  number: 5,
  match: 'false'
}, {
  color: 'blue',
  number: 6,
  match: 'false'
}]

4 个答案:

答案 0 :(得分:1)

您可以使用mapsome

这里的想法是

  • 首先在临时变量中合并两个数组。
  • 获取变量中第一个数组的长度。
  • 现在在合并数组上映射,并且对于每个小于length1的索引,请与array2匹配,否则与array1匹配

const array1 = [ {color: 'red', number: 1, match: ''}, {color: 'red', number: 2, match: ''}, {color: 'red', number: 3, match: ''} ]
const array2 = [ {color: 'red', number: 3, match: ''}, {color: 'blue', number: 5, match: ''}, {color: 'blue', number: 6, match: ''} ]

let temp = [...array1,...array2]
let length1 = array1.length
let op = temp.map((inp,index)=> ({...inp, match: (index < length1 ?array2 : array1).some(({number})=> number === inp.number)}))

console.log(op)

答案 1 :(得分:0)

除了检查array2中的array1,反之亦然。之前连接这两个数组可以处理误报。

enterKey()
{
    document.querySelector('#password-confirm').addEventListener('keydown', function (e) {
       if (e.key === 'Enter') {
           this.confirmPassword();
       }
    });
}

confirmPassword()
{
    document.getElementById('confirm-password').click();
}

答案 2 :(得分:0)

假设您实际上想要保留重复项,就像提供的预期输出中那样,这就是我要做的:

let t = [...array1, ....array2]
return t.map(item => {
  item.match = t.filter(i => { i.number === item.number }).length > 1
})

答案 3 :(得分:0)

您可以使用map()find()

const array1 = [ {color: 'red', number: 1, match: ''}, {color: 'red', number: 2, match: ''}, {color: 'red', number: 3, match: ''} ]
const array2 = [ {color: 'red', number: 3, match: ''}, {color: 'blue', number: 5, match: ''}, {color: 'blue', number: 6, match: ''} ]


function checkMatches(arr1,arr2){
 return arr1.map(x => arr2.find(a => a.number === x.number) ? ({...x,match:'true'}) : ({...x,match:'false'}));
}
let res = [...checkMatches(array1,array2),...checkMatches(array2,array1)]

console.log(res)