首页 > 解决方案 > 使用 Reduce 而不是链接过滤器和映射

问题描述

我有一个函数接受一组狗对象并返回一个包含所有所有者姓名的数组。

    dogs = [
      {name: 'Archie', breed: 'Lurcher', owner: 'Jack'},
      {name: 'Charlie', breed: 'Pug', owner: 'John'},
      {name: 'Buddy', breed: 'Pug', owner: 'Mike'}
    ]

我通过链接过滤器和映射得到结果,但这意味着我在同一个列表上循环了两次。我知道这可以使用 Reduce 来完成,但不确定我将如何做到这一点。很多关于 Reduce 的例子似乎都带有数字,当我试图解决我的问题时,这有点令人困惑。

任何帮助,将不胜感激。谢谢

function getOwners(dogs) {

   return dogs.filter(dog => dog.breed === 'Pug').map(dog => dog.owner);
}

  returns ['John', 'Mike']

标签: javascriptreduce

解决方案


您正在寻找的功能是:

dogs.reduce((total, current) => current.breed === "Pug" ? [...total, current.owner] : total, []);

我们检查狗并测试current.breed === "Pug"每个元素,如果是真的,我们将当前狗的所有者添加到total数组中,否则我们保持整个数组不变。


推荐阅读