在JavaScript中,我们遇到了一个阶段,我们想基于键从对象数组中获取对象(如果我们不在骨干集合的上下文中工作(。
JavaScript的较新版本的方法可以直接完成上述操作。
,但也可以通过ES5中的减少方法来完成。
引入.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()
仅表示"将数组减少到一个项目,但是看起来可能看起来"。您必须阅读表达式以确定减少的作用。对于找到某些东西等常见功能,这是一个麻烦。
另一个区别:.find()
在找到第一个元素后停止并返回第一个元素。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);
现在,减少变得更加不可读。