2013-07-24 149 views
0

假设我们有一个数组:如何在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" 
}]; 

我们想找到阵列(penicillinstreptomycinneomycin这里)对象的全部数值属性minmax假设值可以为空/缺席。

如何从JavaScript中的对象数组中聚合这些数据?

回答

3

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

Math.max.apply(Math, values); 
+0

不要忘记,如果源数组中的任何值都是“undefined”,'Math.max.apply'将会抛出并返回'NaN'。 – Alnitak

+0

不错的解决方案,需要学习文档;( – FSou1

+0

Coulde你在'map()'上多了一点:如何返回多个值从我们提供给map的函数? – DuckQueen

1

不幸的是,JS标准库不提供Array.max或“啃削”(=收集)的功能,但也有许多库,做,例如强调:

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() 

但说真的,你为什么要推倒重来?只需使用图书馆。

UPD:如果我正确地解释你的意见,你正在寻找这样的事情:

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]} 
+0

是啊...这里的问题是抓住所有对象的'!(!isNaN(object [prop]))''''''''''''''''''''''''''''''''''''这样才能有一个自由度的属性名称,并且所有的属性值都会聚集在一起,而不仅仅是一个 – DuckQueen

+0

@DuckQueen:查看更新 – georg

+0

点是克服所有统计 - min和max从所有对象数值属性 - 这里[0.09,850](好像它们在图表中表示的是相同的值类型) – DuckQueen

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

和数组与值填充如果它们存在和简单地计算。

希望这会有所帮助。

+0

好日子,Point是从所有对象数值属性中获取所有统计信息 - 最小值和最大值 - 此处[0.09,850](就好像它们在图表上可以表示相同的值类型) – DuckQueen

相关问题