Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/435.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/jquery/82.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/joomla/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 从值数组中获取多个最大值_Javascript_Jquery_Underscore.js - Fatal编程技术网

Javascript 从值数组中获取多个最大值

Javascript 从值数组中获取多个最大值,javascript,jquery,underscore.js,Javascript,Jquery,Underscore.js,例如,在下划线/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:

例如,在
下划线/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 ];

使用下划线是可以的。

像这样的东西应该可以做到这一点

_.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;
    }
})
更新修复了损坏的代码;)


是否有任何特殊要求,比如不能将多个功能组合在一起以实现multiplemax。如果没有,我有两个解决方案

最简单的解决方案是使用.max查找数组的max
age
,然后使用.filter筛选所有等于max
age

另一种解决方案是使用.groupBy按
age
对数组进行分组,然后使用max
age

像这样的

function multiplemax(arr, compare) {
  var groups = _.groupBy(arr, compare);
  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]});
}

这应该可以做到:

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');

以下是使用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);
};
constmultipleMaxby=(列表:T[],迭代对象:(元素:T)=>number)=>{
const maxScore=Math.max(…list.map(iteratee));
返回list.filter((element)=>iteratee(element)==maxScore);
};

它是否总能返回数组?显然。。。结果也应该是一个数组。请注意,键将是字符串-因此,如果采用
more“下划线”
方法,您可能希望选择
var max=uuu.max(键,函数(d){return parseInt(d,10);})
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');
const multipleMaxBy = <T>(list: T[], iteratee: (element: T) => number) => {
  const maxScore = Math.max(...list.map(iteratee));
  return list.filter((element) => iteratee(element) === maxScore);
};