1

创建“词典的词典”的优选方式假设我需要一个JavaScript字典(对象/关联数组),我需要访问如下:在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中都可以使用的解决方案。

回答

1

的选择是动态创建的对象,如:

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/

所以你的变量列表将不得不被放入一个数组,并传递给函数或函数可以修改任意数量的传递的参数来工作。

+0

这似乎是最好的解决方案,我可能会接受它。 – adrianp 2013-04-30 06:34:25

+0

@adrianp接受任何最适合你的作品。您的原始问题有点令人困惑,所以只要解决方案适用于您并且运作良好,请继续。如果您想更多地了解解决方案,请咨询任何人 – Ian 2013-04-30 13:33:18

1

你可以简单地在一行定义它:

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


使用JSON.parse

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

如果'bar'是一个变量,这将无法正常工作。 – adrianp 2013-04-29 13:49:07

+0

@adrianp您应该编辑您的原始问题以包含该要求。 – 2013-04-29 13:53:29

+0

@ThomasIngham我做到了。 – adrianp 2013-04-29 13:54:25

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/

而且,类似的问题在这里问:Extend a JavaScript object by passing a string with the path and a value

+0

虽然此解决方案完成其工作,但我对其“可维护性”(对于继承我的项目的任何人)有点担心。 – adrianp 2013-04-30 06:38:04