例如,在underscore/lowdash
中,您可以使用_.max(list, [iterator], [context])
函数来接收一个最大值。但是我想让它返回多个最大值,如果它们都相等的话。
var stooges = [{name: 'moe', age: 40}, {name: 'larry', age: 50}, {name: 'curly', age: 50}];
_.max(stooges, function(stooge){ return stooge.age; });
=> {name: 'curly', age: 50};
我希望有这样的事情:
var stooges = [{name: 'moe', age: 40}, {name: 'larry', age: 50}, {name: 'curly', age: 50}];
_.multiplemax(stooges, function(stooge){ return stooge.age; });
=> [{name: 'curly', age: 50}, {name: 'larry', age: 50 ];
使用下划线是可以的。
答案 0 :(得分:3)
是否有任何特殊要求,例如您无法将多个功能组合起来执行multiplemax。如果不是,我脑子里有两个解决方案
最简单的解决方案是使用_.max查找数组的最大age
,然后使用_.filter过滤所有等于max age
的值
另一个解决方案是使用_.groupBy按age
对数组进行分组,然后获取最大age
像这样的东西
function multiplemax(arr, compare) {
var groups = _.groupBy(arr, compare);
var keys = _.keys(groups);
var max = _.max(keys);
return groups[max];
}
更多“下划线”
_.mixin({
multiplemax: function(arr, fn) {
var groups = _.groupBy(arr, fn);
var keys = _.keys(groups);
var max = _.max(keys);
return groups[max];
}
})
或使用max
+ filter
function multiplemax(arr, compare) {
var max = _.max(arr, function(v){return v[compare]});
return _.filter(arr, function(v){return v[compare]==max[compare]});
}
答案 1 :(得分:1)
这样的事情应该可以解决问题。
_.mixin({
multiplymax: function(items, comparitor) {
comparitor = comparitor || _.identity;
var max = comparitor(items.pop());
var found = [max];
_.each(items, function(item) {
var val = comparitor(item);
if(val > max) {
found = [item];//empty
max = val;
} else if (val === max) {
found.push(item);
}
});
return found;
}
})
更新修复了损坏的代码;)
_.multiplymax([{age: 1}, {age:5}, {age:7}, {age:7}, {age:3}], _.property("age")); // [{age:7}, {age:7}]
答案 2 :(得分:1)
这应该可以解决问题:
var stooges = [{name: 'moe', age: 40}, {name: 'larry', age: 50}, {name: 'curly', age: 50}];
_.mixin( { multiplemax: function(list, field){
var max = _.max(list, function(item){
return item[field];
});
return _.filter(list, function(item){
return item[field] === max[field];
});
}});
var oldStooges = _.multiplemax(stooges, 'age');
答案 3 :(得分:1)
这是使用TypeScript和ES6的现代版本:
const multipleMaxBy = <T>(list: T[], iteratee: (element: T) => number) => {
const maxScore = Math.max(...list.map(iteratee));
return list.filter((element) => iteratee(element) === maxScore);
};