2015-04-27 55 views
1

我有一個包含對象的數組,像這樣:創建一個從對象屬性的集合兩個數組和值lodash

[{ 
"first" : 1 
}, 
{ 
"second" : 2 
}, 
{ 
"third" : 3 
}] 

我希望把它變成兩個陣列,帶有索引匹配基於這些值如:

["first","second","third"] 
[1,2,3] 

我可以通過這個迭代並獲取對象鍵和值,但我覺得還有得是在lodash一個漂亮的方式做到這一點,我不知道。有什麼建議麼?謝謝!

+0

數組中的每一項都是不同的形狀。我懷疑如果你正在進行這樣的操作,不同的結構會更適合你的需求。例如,一個元組數組可能會更好:'[[''first',1],['second',2],['third',3]]' –

+0

這是一個圖表庫,它使用這個標籤和數據結構。 – dzm

回答

1

對於非lodash溶液:

var arr = [{"first" : 1},{"second" : 2},{"third" : 3}]; 
var keys = arr.map(function(el){return Object.keys(el)[0];}); 
var vals = arr.map(function(el){return el[Object.keys(el)[0]];}); 

對於相反的問題(多個陣列到對象中的一個陣列),參見Merge two arrays into an array of objects with property values

+0

這工作完美。謝謝 – dzm

3

好像你只需要映射在對象,然後調用keys()values()

你會得到第一個陣列,如:

var items = [{a: "1"},{b: "blah",c: "what"},{d: "3"}] 
keys = _(items).map(_.keys).flatten().value() 

回報["a","b","c","d"]

與第二陣列狀:

values = _(items).map(_.values).flatten().value() 

返回["1","blah","what","3"]

0

假設你的物體的形狀始終是{"label": value},那麼你可以使用這個香草的JavaScript:

var data = [{"first" : 1},{"second" : 2},{"third" : 3}]; 
var labels = data.map(function(entry) { 
    return Object.keys(entry)[0]; 
}); 
var values = data.map(function(entry) { 
    return entry[Object.keys(entry)[0]]; 
}); 

你的數據結構似乎根據您的意見次優的。我會建議替代的結構:

var data = [ 
    {'label': 'first', 'value': 1}, 
    {'label': 'second', 'value': 2}, 
    {'label': 'third', 'value': 3} 
] 

,然後瑣碎挑選出的標籤和值連接成一個正常的JavaScript:

var labels = data.map(function(entry) { 
    return entry.label; 
}); 
var values = data.map(function(entry) { 
    return entry.value; 
}); 

或者,如果你真的想用lodash:

var labels = _.pluck(data, 'label'); 
var values = _.pluck(data, 'value'); 

希望您可以看到,無論您是否使用lodash,此修訂後的結構都使JavaScript更加簡單。

相關問題