我试图通过 ID 查找唯一记录,包括带有最下面代码的名称,如果我将 if
语句替换为:
if (p.indexOf(c.ID) < 0) p.push(c.ID);
它将创建一个具有唯一 ID 的数组,但我希望最终的数组也包含人名,因此我修改了 if 语句,但 p[1] 并未第一次初始化,并且 reduce 函数也没有初始化按预期运行。如何正确更改下面的代码以达到我想要的效果?
var arrayUnique = function(a) {
return a.reduce(function(p, c) {
if (p[1].indexOf(c.ID) < 0) p.push([c.person, c.ID]);
return p;
}, []);
};
最佳答案
表达式p[1]
不是数组p
中所有id:s的数组,它是数组p中的第二项
.
您可以使用 findIndex
方法,以便提供一个比较项目中 id:s 的函数:
function arrayUnique(a) {
return a.reduce(function(p, c) {
if (p.findIndex(function(e){ return e[1] == c.ID; }) == -1) p.push([c.person, c.ID]);
return p;
}, []);
}
console.log(arrayUnique([
{ ID: 1, person: 'John' },
{ ID: 2, person: 'Malcolm' },
{ ID: 3, person: 'Vera' },
{ ID: 1, person: 'Ian' },
{ ID: 2, person: 'Jenny' }
]));
注意:并非所有浏览器都支持 findIndex
方法,因此您需要一个“polyfill”来支持它们。您可以在 findIndex
documentation 中找到一个.
也可以使用 filter
method 来完成拥有更广泛的支持,但开销更大:
function arrayUnique(a) {
return a.reduce(function(p, c) {
if (p.filter(function(e){ return e[1] == c.ID; }).length == 0) p.push([c.person, c.ID]);
return p;
}, []);
}
关于Javascript - 归约和数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34694763/