如何在Javascript中找到复杂对象数组中的最小/最大值?

时间:2013-07-24 08:02:48

标签: javascript

假设我们有一个数组:

var antibiotics = [{
    bacteria: "Mycobacterium tuberculosis",
    penicillin: 800,
    streptomycin: 5,
    neomycin: 2,
    gram: "negative"
}, {
    bacteria: "Salmonella schottmuelleri",
    penicillin: 10,
    streptomycin: 0.8,
    neomycin: 0.09,
    gram: "negative"
}, {
    bacteria: "Proteus vulgaris",
    penicillin: 3,
    streptomycin: 0.1,
    neomycin: 0.1,
    gram: "negative"
}, {
    bacteria: "Klebsiella pneumoniae",
    penicillin: 850,
    gram: "negative"
}];

我们希望在数组(minmaxpenicillin中找到对象的所有数字属性的streptomycinneomycin,假设值可以无效/缺席。

如何从JavaScript中的对象数组聚合此类数据?

3 个答案:

答案 0 :(得分:3)

您可以使用Array.prototype.map()来获取所需的值,然后将其作为参数传递给Math.max()Math.min()

Math.max.apply(Math, values);

答案 1 :(得分:1)

不幸的是,JS标准库没有提供Array.max或“pluck”(= collect)函数,但是有许多库可以实现,例如:下划线:

maxPenicillin = _.max(_(antibiotics).pluck('penicillin')))

如果你不喜欢图书馆,这些功能很简单:

Array.prototype.max = function() {
    return this.reduce(function(a, b) {
        return a > b ? a : b;
    })
}

Array.prototype.pluck = function(prop) {
    return this.map(function(x) {
        return x[prop];
    })
}

maxPenicillin = antibiotics.pluck('penicillin').max()

但实际上,你为什么要重新发明轮子?只需使用图书馆。

更新:如果我正确理解您的评论,您正在寻找类似的内容:

var values = {};

_.each(antibiotics, function(x) {
    _.each(x, function(v, k) {
        if(!isNaN(v))
            values[k] = (values[k] || []).concat([v]);
    })
})

var minmax = {};

_.each(values, function(v, k) {
    minmax[k] = [_.min(v), _.max(v)]
})

结果:

{"penicillin":[3,850],"streptomycin":[0.1,5],"neomycin":[0.09,2]}

答案 2 :(得分:0)

这应该可以解决问题。

http://jsfiddle.net/vgW4v/

Array.prototype.max = function() {
    return Math.max.apply(null, this);
};

Array.prototype.min = function() {
    return Math.min.apply(null, this);
};

如果数组存在且只是计算,则数组中会填充值。

希望这有帮助。