reduce 适合这样的事情:在对象数组上执行聚合操作(如 min、max、avg 等),并返回单个结果:
myArray.reduce(function(prev, curr) {
return prev.Cost < curr.Cost ? prev : curr;
});
...或者您可以使用 ES6 函数语法定义该内部函数:
(prev, curr) => prev.Cost < curr.Cost ? prev : curr
如果你想变得可爱,你可以把它附加到数组:
Array.prototype.hasMin = function(attrib) {
return (this.length && this.reduce(function(prev, curr){
return prev[attrib] < curr[attrib] ? prev : curr;
})) || null;
}
现在你可以说:
myArray.hasMin('ID') // result: {"ID": 1, "Cost": 200}
myArray.hasMin('Cost') // result: {"ID": 3, "Cost": 50}
myEmptyArray.hasMin('ID') // result: null
请注意,如果您打算使用它,它不会对每种情况进行全面检查。如果你传入一个原始类型的数组,它将失败。如果您检查不存在的属性,或者不是所有对象都包含该属性,您将获得最后一个元素。这个版本有点笨重,但有这些检查:
Array.prototype.hasMin = function(attrib) {
const checker = (o, i) => typeof(o) === 'object' && o[i]
return (this.length && this.reduce(function(prev, curr){
const prevOk = checker(prev, attrib);
const currOk = checker(curr, attrib);
if (!prevOk && !currOk) return {};
if (!prevOk) return curr;
if (!currOk) return prev;
return prev[attrib] < curr[attrib] ? prev : curr;
})) || null;
}