2013-10-25 200 views
1

我想在JavaScript中創建數據結構如下:追加值的JavaScript字典

d = {"foo": [3, 77, 100], "bar": [10], "baz": [99], "biff": [10]} 

我的出發數據結構是字典的AA名單:

input = [{"key": "foo", "val": 3}, {"key": "bar", "val": 10}, {"key": "foo", "val": 100}, {"key": "baz", "val": 99}, {"key": "biff", "val": 10}, {"key": "foo", "val": 77] 

怎樣才能我的期望數據結構?下面的代碼似乎沒有將值附加到值數組。

var d = {} 

for (var i in input) { 
    var datum = input[i]; 
    d[datum.key] = datum.val 
} 
+2

什麼'hops'?你不是指'var datum = input [i];'?附:不要在數組中使用'for..in':http://stackoverflow.com/a/500531 –

+1

迭代'input',看看'd'是否具有''key''每個值的屬性,並且如果不是,則使用該值爲'd'賦予一個屬性,並分配一個數組。然後將''val''的值放入數組中。 –

+0

啊,謝謝。我的錯,錯字。 – turtle

回答

9
for (var i = 0; i < input.length; i++) { 
    var datum = input[i]; 
    if (!d[datum.key]) { 
     d[datum.key] = []; 
    } 
    d[datum.key].push(datum.val); 
} 

僅供參考,不應該使用for (var i in input)遍歷數組。

+0

你比我快一點。同樣的確切答案:) – Akshay

0

請嘗試以下方法:

 var input = [{ "key": "foo", "val": 3 }, { "key": "bar", "val": 10 }, { "key": "foo", "val": 100 }, { "key": "baz", "val": 99 }, { "key": "biff", "val": 10 }, { "key": "foo", "val": 77 }]; 
     var d = {}; 

     for (var i = 0; i < input.length; i++) { 
      var entry = input[i]; 
      if (d[entry.key] === undefined) d[entry.key] = []; 
      d[entry.key].push(entry.val); 
     } 

     alert(JSON.stringify(d)); 
1

的另一種方式,與reduce

var d = input.reduce(function (res, item) { 
    var key = item.key; 

    if (!res[key]) res[key] = [item.val]; 
    else res[key].push(item.val); 

    return res; 

}, {}); 
+0

可能不是最清楚的新手,但我喜歡它:) –

+0

@ user1523882,是的,它可能不是,但我真的很喜歡使用reduce函數的'initialValue'來構建這樣的地圖。一旦你習慣了它,這很好,因爲你可以在一個* external *語句中完成它。 – plalx

0
var result = {} 
input.forEach(function(keyObject){ 
    //Make array for key if doesn't exist 
    result[keyObject.key] = result[keyObject.key] ? result[keyObject.key] : []; 
    //Add value to array 
    result[keyObject.key].push(keyObject.val); 
}); 
console.log(result); 
0

你應該做下:

for (var i in input){ 
    var datuml = input[i];  
    if(!d[datuml.key]){ 
     d[datuml.key]=[]; 
    } 
    d[datuml.key].push(datuml.val); 
}