使用数组辅助函数的具有唯一值的数组

时间:2018-01-21 11:47:10

标签: javascript arrays ecmascript-6

我正在玩 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两次而其他所有值都是唯一的?

2 个答案:

答案 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"]