0

如何在忽略其中一个键的情况下使用 lodash 在对象集合中找到最大单元格值。

var data = [{
            tick: 0,
            valueA: 3,
            valueB: 2
        }, {
            tick: 6,
            valueA: 6,
            valueB: 3
        }, {
            tick: 12,
            valueA: 2,
            valueB: 4
        }, ...];

我想找到最大刻度,这是行标识符,以及所有其他值的最大值。到目前为止,我所拥有的是:

var maxTick = _.max(data, 'tick'),
    maxValue = _.max(data, function(o) { return _.max(_.values(o))};);

我怎样才能maxValue忽略刻度数据?

4

3 回答 3

4

沿着 T Nguyen 的思路,但使用_.omit而不是选择那种方式,你只需要省略tick

_.max(data, function(o){_.omit(o, "tick")})
于 2013-12-06T20:18:02.090 回答
1

您只需要一个遍历所有元素属性和被忽略属性列表的函数。这是一个示例:

var  findMax = function(list, ignoredFields){
    var maxValue = null;
    for(var i=0;i<list.length;i++){
        for(var prop in list[i]){
            if(ignoredFields.indexOf(prop) < 0){
                maxValue = maxValue < list[i][prop] ? list[i][prop] : maxValue;
            }
        }
    }
    return maxValue;
}

然后你用你的数据和被忽略的属性列表执行函数

findMax(data,['tick'])

更新:修改函数以使用 lodash 迭代

var  findMax = function(list, ignoredFields){
    var maxValue = null;
    _.forEach(list, function(element, index) {
        var _localMax = _.max(_.omit(element, ignoredFields));
        maxValue = maxValue < _localMax ? _localMax : maxValue;
    });
    return maxValue;
}
于 2013-12-06T20:16:01.037 回答
0

尝试使用 _.pick() 挑选除 tick 之外的所有键,然后在该新集合上运行您的 max 函数。顺便说一句,您的 maxValue 函数似乎不正确。你是说你想在任何对象中取最高标量值,还是包含最高标量值的对象(除了刻度)?

更新:根据您的回复,试试这个:http: //jsfiddle.net/tonicboy/Xxf9E/1/

var data = [{
            tick: 0,
            valueA: 3,
            valueB: 2
        }, {
            tick: 6,
            valueA: 6,
            valueB: 3
        }, {
            tick: 12,
            valueA: 2,
            valueB: 4
        }],
    data2 = [];

_.each(data, function(element, index) {
    var values = _.values(_.omit(element, 'tick'));
    data2 = data2.concat(values);
});

console.log(data2);
console.log(_.max(data2));
于 2013-12-06T20:13:01.443 回答