我试图在JS中使用concat reduce和filter。我发现了一个练习,我可以使用同样的三种方法。我也找到了一个解。但我不能完全理解这是怎么回事。我通过保持断点进行调试,我理解了它的某些部分,但不是完全理解。谁能帮我弄明白下面的逻辑是如何工作的?提前谢谢。
var item1 = [
{"id":1,"b":"first"},
{"id":2,"b":"second"}
];
var item2 = [
{"id":3,"b":"third", "c":true},
{"id":1,"b":"fourth", "c":true},
{"id":2,"b":"fivth", "c":true},
{"id":4,"b":"frr", "c":true}
];
var res = item1.concat(item2).reduce((aggr, el)=>{
// console.log("aggr", aggr)
if(!aggr.find(item2=>item2.id==el.id))
return [...aggr, el];
else
return aggr
},[])
item1.concat(item2)
=我明白我正在连接item1和第二条。.reduce
=我知道减少将接受2个参数一个是另一个是currentvalue,这里aggr是acc, el是currentvalue。- 我没有在里面得到!aggr的逻辑。"aggr inside find"是什么意思我得到他们正在检查相同的ID,但在此之前!聚合是令人困惑的。
简而言之,在连接两个数组之后,它从连接的数组中减少/删除与item2数组具有相同id的项。
供参考,在每次迭代中,aggr由reduce方法返回的前一次迭代值组成,el由连接数组的当前值组成。
aggr.find(item2=>item2.id==el.id)
返回聚合体中id与el相同的第一个元素。如果没有找到,则返回undefined。!aggr.find()
将在查找返回undefined时为true。
如果条件为真,则使用aggr添加el元素,并使用return [...aggr, el]
语句返回值。否则,它只返回聚合。
我希望这对你有帮助。如果你有更多的困惑,请告诉我!