我正在玩 ES6 数组辅助函数 reduce()和 find()。我正在尝试显示独特元素的数组。但是在值 0 的情况下失败了。我无法找到我的代码有什么问题。请指导。
这是我的代码段:
var arrayWithDuplicates = [0, 0, 1, 2, 3, 3, 4, 4, 'a', 'a'];
var arrayWithUniqueValues = arrayWithDuplicates
.reduce((previous, item) => {
if(!previous.find(element => element === item)) {
previous.push(item)
}
return previous;
}, []);
console.log('arrayWithUniqueValues', arrayWithUniqueValues)
我的输出低于输出:
arrayWithUniqueValues [ 0, 0, 1, 2, 3, 4, 'a' ]
为什么我得到0两次而其他所有值都是唯一的?
答案 0 :(得分:2)
通过将数组转换为Set并返回到Array,可以获得相同的结果。
var arrayWithUniqueValues = [...new Set(arrayWithDuplicates)];
顺便说一下,你的代码不起作用的原因是Array.prototype.find
返回它找到的元素。搜索0时,它返回0,然后!0
为真。因此即使它已经在数组中,也会添加0。你可以这样做:
if (previous.indexOf(item) === - 1) {
previous.push(item);
}
答案 1 :(得分:1)
find()方法返回数组中第一个满足提供的测试函数的元素的值。否则返回undefined。
当你得到0时,代码变为:
arrayWithDuplicates.reduce(([0], 0) => {
if(!previous.find(element => element === item)) {
//![0].find(0=>0===0),return 0,so !0 means true
previous.push(item)
//so [0,0]
}
return previous;
});
更好的方法是
let a=[...new Set([0, 0, 1, 2, 3, 3, 4, 4, 'a', 'a'])];//[0, 1, 2, 3, 4, "a"]