gpt4 book ai didi

javascript - javascript 中的 min_by、max_by 等效函数

转载 作者:搜寻专家 更新时间:2023-11-01 04:44:16 24 4
gpt4 key购买 nike

是否有任何 javascript 库包含 Ruby 中的 min_by、max_by 等函数,这些函数允许您传递 lambda 作为比较标准。我在 JQuery 和 underscore.js 中没有发现这样的东西。

最佳答案

Chris 的解决方案遍历数组 3 次;如果数组很小,那很好,但并不理想。您可以使用 reduce 将其简化为单次传递(使用 Schwartzian transform 的一种即用型版本):

// the only difference between minBy and maxBy is the ordering
// function, so abstract that out
Array.prototype.minBy = function(fn) {
return this.extremumBy(fn, Math.min);
};

Array.prototype.maxBy = function(fn) {
return this.extremumBy(fn, Math.max);
};

Array.prototype.extremumBy = function(pluck, extremum) {
return this.reduce(function(best, next) {
var pair = [ pluck(next), next ];
if (!best) {
return pair;
} else if (extremum.apply(null, [ best[0], pair[0] ]) == best[0]) {
return best;
} else {
return pair;
}
},null)[1];
}

如广告所示:

['albatross', 'dog', 'horse'].minBy( s => s.length )
// => "dog"

['albatross', 'dog', 'horse'].maxBy( s => s.length )
// => "albatross"

我们可以通过允许“plucker”作为索引或属性名称以及函数来使其更漂亮:

const pluck = function(object, plucker) {
const t = typeof plucker;
switch (t) {
case 'function':
return plucker(object)
case 'number':
case 'string':
return object[plucker]
default:
throw new TypeError(`Invalid type for pluck: ${t}`)
}
}

Array.prototype.extremumBy = function(plucker, extremum) {
return this.reduce(function(best, next) {
var pair = [ pluck(next, plucker), next ];
...

然后这也有效:

['albatross', 'dog', 'horse'].minBy('length')
//=> 'dog'

['albatross', 'dog', 'horse'].maxBy('length')
//=> 'albatross'

关于javascript - javascript 中的 min_by、max_by 等效函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25888963/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com