假设我需要一个我需要访问的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中都有效的解决方案。
答案 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"}}}};
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;
}
}
}
}
此外,此处也提出了类似的问题:Extend a JavaScript object by passing a string with the path and a value。