2

假设我需要一个 JavaScript 字典(对象/关联数组),我需要按如下方式访问它:

var value = dict[foo][bar][buz][qux]; // this could go on

初始化此字典的最佳方法是什么?我能想到的唯一方法是:

// 'foo', 'bar', 'baz', 'qux' are variables
var dict = {};
dict[foo] = {};
dict[foo][bar] = {};
dict[foo][bar][buz] = {};
dict[foo][bar][buz][qux] = value;

或者,是否有更好的方法来实现相同的结果?我更喜欢在浏览器和 Node.js 中都适用的解决方案。

4

3 回答 3

2

使用JSON.parse

var dict = JSON.parse('{ "' + foo + '": { "' + bar + '": { "' + buz + '": { "' + qux + '": "value"}}}}');
于 2013-04-29T13:47:59.500 回答
2

一个选项是动态构建对象,例如:

var vals = [1, 2, 3, 4];

function createObject(arr) {
    var obj = {};
    var mod = obj;
    for (var i = 0, j = arr.length; i < j; i++) {
        if (i === (j - 1)) {
            mod.value = arr[i];
        } else {
            mod[arr[i]] = {};
            mod = mod[arr[i]];
        }
    }
    return obj;
}

console.log(createObject(vals));

演示:http: //jsfiddle.net/BnkPz/

因此,您的变量列表必须放入数组中并传递给函数,或者可以修改函数以使用任意数量的传递参数。

于 2013-04-29T14:11:55.937 回答
0

您可以创建一个函数,该函数接受要修改的对象、叶子属性的路径(一个点分隔的字符串,如foo + '.' + bar + '.' + buz + '.' + qux)和值,并让它循环并为您完成工作:

var foo = 'foo',
    bar = 'bar',
    buz = 'buz',
    qux = 'qux',
    path = foo + '.' + bar + '.' + buz + '.' + qux,
    dict = {};

createNestedProperty(dict, path, 10);
console.log(dict);

function createNestedProperty(dict, path, value) {
    var pathArray = path.split('.'),
        current;
    while(pathArray.length) {
        current = pathArray.shift();
        if(!dict.hasOwnProperty(current)) {
            if(pathArray.length) {
                dict[current] = {};  
            // last item
            } else {
                dict[current] = value;     
            }
        }
    }
}

http://jsfiddle.net/NuqtM/

此外,这里还提出了一个类似的问题:Extended a JavaScript object by pass a string with the path and a value

于 2013-04-29T14:14:05.070 回答