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