2013-10-25 5 views
1

Я пытаюсь создать следующую структуру данных в JavaScript:значение Append в яваскрипта словаря

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

Моей структура Отправных данных аа список словарей:

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

FYI, вы не должны использовать 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, Да, возможно, это не так, но мне очень нравится использовать 'initialValue' функций сокращения для создания таких карт. Как только вы привыкнете к этому, это приятно, потому что вы можете сделать это в одном * внешнем * заявлении. – 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); 
} 
Смежные вопросы