Javascript 如何筛选出数组之间的匹配项,并添加额外的键/值?
我有两个包含对象的数组。每个对象都有一个键/值对“颜色”和“数字”。我想对照这两个数组查找与“数字”匹配的对象。找到这个后,我想向原始数组中的所有对象添加一个键值对 我有下面的例子,我相信这是正确的,但我正在努力找出如何继续 基本上,如果对象匹配,我想将“match”的K/V对更改为true或falseJavascript 如何筛选出数组之间的匹配项,并添加额外的键/值?,javascript,arrays,Javascript,Arrays,我有两个包含对象的数组。每个对象都有一个键/值对“颜色”和“数字”。我想对照这两个数组查找与“数字”匹配的对象。找到这个后,我想向原始数组中的所有对象添加一个键值对 我有下面的例子,我相信这是正确的,但我正在努力找出如何继续 基本上,如果对象匹配,我想将“match”的K/V对更改为true或false const array1 = [ {color: 'red', number: 1, match: ''}, {color: 'red', number: 2, match: ''}, {col
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'
}]
除了在array2中检查array1和array2中检查array1之外,我无法以其他方式思考。之前将这两个数组合并可以处理误报
const array1=[{color:'red',number:1,匹配:'},{color:'red',number:2,匹配:'},{color:'red',number:3,匹配:'}]
const array2=[{color:'red',number:3,match:'},{color:'blue',number:5,match:'},{color:'blue',number:6,match:'}]
函数检查匹配按编号(arr1、arr2){
返回arr1.map(x=>(arr2.filter(y=>y.number==x.number).length>0?x.match=true:x.match=false,x));
}
设resp=[].concat(checkMatchesByNumbers(array1,array2),checkMatchesByNumbers(array2,array1));
console.log(resp)
您可以使用map
和some
这是我的想法
- 首先在临时变量中合并两个数组
- 获取变量中第一个数组的长度
- 现在映射到合并数组,对于小于
length1的每个索引,将其与
匹配,否则将其与array2
array1
const array1=[{color:'red',number:1,匹配:'},{color:'red',number:2,匹配:'},{color:'red',number:3,匹配:'}]
const array2=[{color:'red',number:3,match:'},{color:'blue',number:5,match:'},{color:'blue',number:6,match:'}]
设温度=[…阵列1,…阵列2]
let length 1=阵列1.长度
设op=temp.map((inp,index)=>({…inp,match:(indexnumber==inp.number)}))
console.log(op)
假设您确实希望保留重复项,就像您提供的预期输出一样,我会这样做:
let t=[…array1,…array2]
返回t.map(项=>{
item.match=t.filter(i=>{i.number===item.number})。长度>1
})
您可以使用map()
和find()
const array1=[{color:'red',number:1,匹配:'},{color:'red',number:2,匹配:'},{color:'red',number:3,匹配:'}]
const array2=[{color:'red',number:3,match:'},{color:'blue',number:5,match:'},{color:'blue',number:6,match:'}]
函数检查匹配(arr1、arr2){
返回arr1.map(x=>arr2.find(a=>a.number===x.number)?({…x,匹配:'true'}):({…x,匹配:'false'});
}
设res=[…checkMatches(array1,array2),…checkMatches(array2,array1)]
console.log(res)
预期输出?@CodeManiac addedWhy您的函数声明为async
?中没有async
操作there@gbalduzzi这些数组来自于我的完整代码中的承诺,您应该使用array1.reduce()
。在减速机内部,您可以在array2
上执行另一个循环,比较值并根据需要更改array1
的对象,以在array3
中输出所需内容。这几乎就是它的全部。为了可重用性,如果只匹配number
的话,它会工作吗?这就是为什么我最初研究的是过滤器
@knockedloose你所说的是什么意思?如果只有匹配的数字,这能起作用吗代码>如果没有匹配的数字,它将简单地将匹配设置为false,如果arr1有一个对象{color:'red',number:1,match:'}
其中arr2有{color:'blue',number:1,match:'}
。这会被视为一个匹配,还是它看起来与整个对象匹配?@knockedflose它会匹配,因为我们只是根据数字而不是名称进行匹配。这是您在问题中指定的内容。您可以使用name&&number
如果您希望两者都必须匹配caseAh,可以理解,这真的很简洁明了,谢谢您花时间来帮助!