Javascript 在数组中设置对象属性true/false,无论该id是否与另一个对象数组中的任何id匹配
首先,这里有一个简单的片段来演示我的确切意思,以及我所做的尝试Javascript 在数组中设置对象属性true/false,无论该id是否与另一个对象数组中的任何id匹配,javascript,arrays,object,ecmascript-6,Javascript,Arrays,Object,Ecmascript 6,首先,这里有一个简单的片段来演示我的确切意思,以及我所做的尝试 让数组_1=[ {id:1,名字:'Peter'}, {id:2,名字:'John'}, {id:3,名字:'Andrew'}, {id:4,名字:'Patrick'}, {id:5,名字:'Brian'} ]; 设数组_2=[ {id:1,名字:'不是彼得'}, {id:80,名字:'不是约翰'}, {id:3,名字:'不是安德鲁'}, {id:40,名字:'不是帕特里克'}, {id:5,名字:'不是布莱恩'} ]; 数组_1
让数组_1=[
{id:1,名字:'Peter'},
{id:2,名字:'John'},
{id:3,名字:'Andrew'},
{id:4,名字:'Patrick'},
{id:5,名字:'Brian'}
];
设数组_2=[
{id:1,名字:'不是彼得'},
{id:80,名字:'不是约翰'},
{id:3,名字:'不是安德鲁'},
{id:40,名字:'不是帕特里克'},
{id:5,名字:'不是布莱恩'}
];
数组_1.forEach(项_1=>{
for(设i=0;i log('matched_array',array_1)
您可以首先使用reduce
方法创建一个对象,然后将其用作哈希表,以检查数组2中是否存在具有相同id的元素
let array_1=[{“id”:1,“name”:“Peter”},{“id”:2,“name”:“John”},{“id”:3,“name”:“Andrew”},{“id”:4,“name”:“Patrick”},{“id”:5,“name”:“Brian”},{“id”:6,“name”:“Joe”}]
让数组2=[{“id”:1,“name”:“not Peter”},{“id”:80,“name”:“not John”},{“id”:3,“name”:“not Andrew”},{“id”:40,“name”:“not Patrick”},{“id”:5,“name”:“not Brian”}]
常量o=array_2.reduce((r,e)=>(r[e.id]=true,r),{})
const result=array_1.map(e=>({…e,matches:o[e.id]| | false}))
log(result)
您可以首先使用reduce
方法创建一个对象,然后将其用作哈希表,以检查数组2中是否存在具有相同id的元素
let array_1=[{“id”:1,“name”:“Peter”},{“id”:2,“name”:“John”},{“id”:3,“name”:“Andrew”},{“id”:4,“name”:“Patrick”},{“id”:5,“name”:“Brian”},{“id”:6,“name”:“Joe”}]
让数组2=[{“id”:1,“name”:“not Peter”},{“id”:80,“name”:“not John”},{“id”:3,“name”:“not Andrew”},{“id”:40,“name”:“not Patrick”},{“id”:5,“name”:“not Brian”}]
常量o=array_2.reduce((r,e)=>(r[e.id]=true,r),{})
const result=array_1.map(e=>({…e,matches:o[e.id]| | false}))
console.log(result)
我会首先收集a集中数组_2
的id,该集合有一个O(1)查找时间,因此检查id是否在该集合中是快速的。然后迭代数组_1
,并使用检查id是否存在于创建的集合中
让数组_1=[
{id:1,名字:'Peter'},
{id:2,名字:'John'},
{id:3,名字:'Andrew'},
{id:4,名字:'Patrick'},
{id:5,名字:'Brian'}
];
设数组_2=[
{id:1,名字:'不是彼得'},
{id:80,名字:'不是约翰'},
{id:3,名字:'不是安德鲁'},
{id:40,名字:'不是帕特里克'},
{id:5,名字:'不是布莱恩'}
];
常量数组_2_id=新集合(数组_2.map(item_2=>item_2.id));
array_1.forEach(item_1=>item_1.matches=array_2_id.has(item_1.id));
log('matched_array',array_1)
我会首先收集一个集合中的数组2
的id,该集合有一个O(1)查找时间,因此检查id是否在该集合中很快。然后迭代数组_1
,并使用检查id是否存在于创建的集合中
让数组_1=[
{id:1,名字:'Peter'},
{id:2,名字:'John'},
{id:3,名字:'Andrew'},
{id:4,名字:'Patrick'},
{id:5,名字:'Brian'}
];
设数组_2=[
{id:1,名字:'不是彼得'},
{id:80,名字:'不是约翰'},
{id:3,名字:'不是安德鲁'},
{id:40,名字:'不是帕特里克'},
{id:5,名字:'不是布莱恩'}
];
常量数组_2_id=新集合(数组_2.map(item_2=>item_2.id));
array_1.forEach(item_1=>item_1.matches=array_2_id.has(item_1.id));
log('matched_array',array_1)代码>这很好用,虽然我在代码片段中确实使它们具有相同的长度,但我注意到当array\u 1
的长度大于array\u 2
时,这就不起作用了。再添加一个对象已引发错误。事实上,这两个数组不必共享相同的长度,虽然我不认为它会计算在内,但它显然会计算在内。你可以编辑它,使它也这样工作吗?更新了我的答案。我开始感觉不好,似乎我在挑剔,我很抱歉,但我也注意到,在尝试实现此代码后,它似乎只将匹配
属性设置为真
,如果两个对象位于相同的索引
。交换'Peter'(1)和'John'(2)的id
,Peter的匹配的属性已设置为false
,即使array_2
˙确实包含id为1的对象。对我来说,它应该是完全随机的数组。我真的不知道这些小细节有多重要。更新了我的答案。现在效果很好,尽管我不知道它是如何工作的(我真的不知道代码中发生了什么),但它确实起到了作用。这很好,尽管我在代码片段中也使用了相同的长度,但是我注意到,一旦array\u 1
的长度大于array\u 2
的长度,这就不起作用了。再添加一个对象已引发错误。事实上,这两个数组不必共享相同的长度,虽然我不认为它会计算在内,但它显然会计算在内。你可以编辑它,使它也这样工作吗?更新了我的答案。我开始感觉不好,似乎我在挑剔,我很抱歉,但我也注意到,在尝试实现此代码后,它似乎只将匹配
属性设置为真
,如果两个对象位于相同的索引
。交换'Peter'(1)和'John'(2)的id
,Peter的匹配的属性已设置为false
,即使array_2
˙确实包含id为1的对象。对我来说,它应该是完全随机的数组。我真的不知道这么小的细节有多重要。更新了我的答案。哇