2016-04-09 92 views
4

我是Javascript新手,無法將INI格式的文件解析爲嵌套對象。Javascript - 將INI文件解析爲嵌套關聯數組

的文件我已經被格式化這樣的:

ford.car.focus.transmission=standard 
ford.car.focus.engine=four-cylinder 
ford.car.focus.fuel=gas 

ford.car.taurus.transmission=automatic 
ford.car.taurus.engine=V-8 
ford.car.taurus.fuel=diesel 

purchased=Ford Taurus 

我想有結構是這樣的:

{ ford: 
    { car: 
    { focus: 
     { 
     transmission: 'standard', 
     engine: 'four-cylinder', 
     fuel: 'gas' 
     } 
    } 
    { taurus: 
     { 
     transmission: 'automatic', 
     engine: 'V-8', 
     fuel: 'diesel' 
     } 
    } 
    } 
    purchased: 'Ford Taurus' 
} 

我存儲的文件中的行中的數組,分裂'\ n'。我試圖寫一個,將在循環中調用的方法,通過我的全局對象是這樣的:

var hash = {}; 
var array = fileData.toString().split("\n"); 
for (i in array) { 
    var tmp = array[i].split("="); 
    createNestedObjects(tmp[0], tmp[1], hash); 
} 

這應該讓我訪問哈希對象的值,如:

hash.ford.car.focus.fuel 
# 'gas' 

hash.purchase 
# 'Ford Taurus' 

我嘗試過這樣的建議:Javascript: how to dynamically create nested objects using object names given by an array,但它似乎只是在巢中設置最後一項。

{ fuel: 'diesel', 
    purchased: 'Ford Taurus' } 

我不成功的嘗試看起來是這樣的:

createNestedObjects(path, value, obj) { 
    var keys = path.split('.'); 
    keys.reduce(function(o, k) { 
    if (k == keys[keys.length-1]) { 
     return o[k] = value; 
    } else { 
     return o[k] = {}; 
    } 
    }, obj); 
} 

然而,它只會爲嵌套值返回的最後一個值:

{ ford: { car: { taurus: { fuel: 'diesel' } } }, 
    purchased: 'Ford Taurus' } 
+1

'createNestedObjects'不檢查對象中是否已存在該鍵,所以如果它已經存在,則替換它。 – Barmar

回答

2

功能需要檢查是否中間鍵在分配給它之前已經存在。

createNestedObjects(path, value, obj) { 
    var keys = path.split('.'); 
    keys.reduce(function(o, k) { 
    if (k == keys[keys.length-1]) { 
     return o[k] = value; 
    } else if (o[k]) { 
     return o[k]; 
    } else { 
     return o[k] = {}; 
    } 
    }, obj); 
} 
+0

非常好!謝謝! – jbmoon