2013-07-24 76 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

相關問題