0

假设我们有一个数组:

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"
}];

并且我们希望在数组 (和此处) 中查找对象min的所有数值属性,假设值可以为空/不存在。maxpenicillinstreptomycinneomycin

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

4

3 回答 3

3

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

Math.max.apply(Math, values);
于 2013-07-24T08:04:26.157 回答
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]}
于 2013-07-24T08:12:06.467 回答
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);
};

如果数组存在并简单地计算,则用值填充数组。

希望这可以帮助。

于 2013-07-24T08:35:49.177 回答