将值附加到javascript字典

tur*_*tle 3 javascript

我想在javascript中创建以下数据结构:

d = {"foo": [3, 77, 100], "bar": [10], "baz": [99], "biff": [10]}
Run Code Online (Sandbox Code Playgroud)

我的起始数据结构是一个字典列表:

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]
Run Code Online (Sandbox Code Playgroud)

如何生成所需的数据结构?以下代码似乎没有将值附加到值数组.

var d = {}

for (var i in input) {
    var datum = input[i];
    d[datum.key] = datum.val
}
Run Code Online (Sandbox Code Playgroud)

Bar*_*mar 11

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);
}
Run Code Online (Sandbox Code Playgroud)

仅供参考,您不应该使用for (var i in input)迭代数组.


l30*_*l3x 5

另一种选择:

const 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 }]
const dict = {}

input.forEach(({ key, val }) =>
    key in dict ? dict[key].push(val) : dict[key] = [val] )

console.log(dict);
Run Code Online (Sandbox Code Playgroud)

一行代码,具有不变性

input.reduce((dict, { key, val }) => ({ ...dict, [key]: [...dict[key] || [], val] }), {})
Run Code Online (Sandbox Code Playgroud)