为什么ES6有“查找”方法,因为它的功能可以通过'减少'来实现?

时间:2018-03-30 06:18:22

标签: ecmascript-6 find reduce

在javascript中,我们遇到了一个阶段,我们想要根据键从对象数组中获取对象(如果我们不在Backbone集合的上下文中工作)。

较新版本的javascript有方法find直接完成上述操作。

但也可以通过es5中的reduce方法完成。

1 个答案:

答案 0 :(得分:1)

引入.find()的最可能原因是它是一个非常常用的功能。以下是代码:

let arr = [{id: 1, descriptor: "firstElement"}, {id: 2}, {id: 3}, {id: 1, descriptor: "lastElement"}];

// find using reduce
let foundItem = arr.reduce((prevItem, item) => item.id === 1 ? item : prevItem, arr); 

// find using find
let foundItem2 = arr.find(item => item.id === 1);

console.log(foundItem); // prints: {id: 1, descriptor: "lastElement"}
console.log(foundItem2); // prints: {id: 1, descriptor: "firstElement"}

使用.find()的代码更简洁,更易于阅读。此外,.find()完全表达了您要在此处执行的操作:“查找与表达式匹配的第一个项目”,而.reduce()仅表示“将数组减少到一个项目,但这可能看起来像”。您必须阅读表达式以确定reduce正在执行的操作。对于寻找某些东西等常见功能来说,这是一件麻烦事。

另一个区别:.find()在找到第一个元素后停止并返回第一个元素。 reduce()方法不会停止,并且在我实现它时,它将返回数组中的LAST匹配元素。如果您想要第一个,则reduce将如下所示:

let arr = [{id: 1, descriptor: "firstElement"}, {id: 2}, {id: 3}, {id: 1, descriptor: "lastElement"}];

let foundItem = arr.reduce((prevItem, item) => prevItem.id === 1 ? prevItem : item.id === 1 ? item : prevItem, arr); 

现在,降低变得更加难以理解。