假设我们有一个数组:
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
,max
和penicillin
中找到对象的所有数字属性的streptomycin
和neomycin
,假设值可以无效/缺席。
如何从JavaScript中的对象数组聚合此类数据?
答案 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)
这应该可以解决问题。
Array.prototype.max = function() {
return Math.max.apply(null, this);
};
Array.prototype.min = function() {
return Math.min.apply(null, this);
};
如果数组存在且只是计算,则数组中会填充值。
希望这有帮助。