Javascript - 归约和数组

标签 javascript arrays reduce

我试图通过 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/

相关文章:

java - 有没有办法使用 Gradle 将 Kotlin 类编译为 JavaScript?

JavaScript/jQuery 简写函数定义

javascript - reduce 函数不会将累加器初始化为零?

java - Map Reduce代码用于计算下降率

javascript - 在多个浏览器或设备上运行时计时器不同步

Java 数组打印

php - 访问数组中的对象

python - numpy.ndarray.shape 改变维度

Javascript 教程,在映射和减少以获得正确答案时遇到问题

javascript - 如何在 Angular 2 的组件之间共享数组?