我对Javascript很陌生,我编写的函数有问题。我正在使用array.reduce()来完成这项工作,但是它在Windows上失败了(在Mac上测试很好)。
我所拥有的文件格式如下:
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);
}我当前的功能如下:
function create_nested_object(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);
}我想把它变成一个for循环。我有如下所示的新代码(我尝试转换array.reduce()代码):
function create_nested_object(path, value, obj) {
var keys = path.split('.');
for (var i = 0; i < keys.length; i++) {
if (keys[i] == keys[keys.length-1]) {
obj[keys[i]] = value;
} else if (obj[keys[i]] == keys[i]) {
obj;
} else {
obj = obj[keys[i]] = {};
}
}
}但它只返回每个嵌套中的最后项:
{
"ford": {
"car": {
"taurus": {
"fuel": "diesel"
}
}
},
"purchased": "Ford Taurus"
}我知道我错过了什么,但我不知道出了什么问题。任何帮助都将不胜感激!
相关问题:Javascript - Parsing INI file into nested associative array
发布于 2016-04-20 00:02:56
编辑以使用os.EOL
注释中的解决方案:在OP代码中:
var array = fileData.toString().split("\n");正如“马蒂”所建议的,需要:
var array = fileData.toString().split(os.EOL);在Windows中。
发布于 2016-04-27 13:48:41
EOL的答案是一个很好的答案,所以我给它投上一票。在回答我关于我的函数为什么失败的问题时,我的回答是,它与Windows无关。问题是Windows机器上的文件在键中有一些重复,导致函数失败。
ford.car.focus.transmission=standard
ford.car.focus.engine=four-cylinder
ford.car.focus.engine.type=big
ford.car.focus.fuel=gas在上面的例子中,engine属性被设置为一个值(四列),然后在函数的下一次迭代中,它试图处理另一个引擎(type=big) (nest)。因为一个对象不能有两次相同的键,所以它会导致函数死掉。
感谢大家的回应!
https://stackoverflow.com/questions/36731411
复制相似问题