在JavaScript中创建“词典词典”的首选方法

时间:2013-04-29 13:36:24

标签: javascript object dictionary initialization associative-array

假设我需要一个我需要访问的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中都有效的解决方案。

3 个答案:

答案 0 :(得分: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));

DEMO: http://jsfiddle.net/BnkPz/

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

答案 1 :(得分:1)

您只需在一行中定义它:

var dict = { foo: { bar: { buz: {qux: "value"}}}};


使用JSON.parse

var dict = JSON.parse('{ "' + foo + '": { "' + bar + '": { "' + buz + '": { "' + qux + '": "value"}}}}');

答案 2 :(得分:0)

您可以创建一个使对象修改的函数,一个指向leaf属性的路径(一个点分隔的字符串,如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/

此外,此处也提出了类似的问题:Extend a JavaScript object by passing a string with the path and a value