首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Node.js - Javascript -将文件解析为嵌套对象

Node.js - Javascript -将文件解析为嵌套对象
EN

Stack Overflow用户
提问于 2016-04-19 23:49:07
回答 2查看 93关注 0票数 0

我对Javascript很陌生,我编写的函数有问题。我正在使用array.reduce()来完成这项工作,但是它在Windows上失败了(在Mac上测试很好)。

我所拥有的文件格式如下:

代码语言:javascript
复制
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

我希望这个结构看起来像这样:

代码语言:javascript
复制
{ ford:
  { car:
    { focus:
      {
        transmission: 'standard',
        engine: 'four-cylinder',
        fuel: 'gas'
      }
    }
    { taurus:
      {
        transmission: 'automatic',
        engine: 'V-8',
        fuel: 'diesel'
      }
    }
  }
  purchased: 'Ford Taurus'
}

我将文件行存储在数组中,在'\n‘上拆分。我试图编写一个循环中调用的方法,传递我的全局对象,如下所示:

代码语言:javascript
复制
var hash = {};
var array = fileData.toString().split("\n");
for (i in array) {
  var tmp = array[i].split("=");
  createNestedObjects(tmp[0], tmp[1], hash);
}

我当前的功能如下:

代码语言:javascript
复制
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()代码):

代码语言:javascript
复制
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]] = {};
    }
  }
}

但它只返回每个嵌套中的最后项:

代码语言:javascript
复制
{
  "ford": {
    "car": {
      "taurus": {
        "fuel": "diesel"
      }
    }
  },
  "purchased": "Ford Taurus"
}

我知道我错过了什么,但我不知道出了什么问题。任何帮助都将不胜感激!

相关问题:Javascript - Parsing INI file into nested associative array

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2016-04-20 00:02:56

编辑以使用os.EOL

注释中的解决方案:在OP代码中:

代码语言:javascript
复制
var array = fileData.toString().split("\n");

正如“马蒂”所建议的,需要:

代码语言:javascript
复制
var array = fileData.toString().split(os.EOL);

在Windows中。

票数 0
EN

Stack Overflow用户

发布于 2016-04-27 13:48:41

EOL的答案是一个很好的答案,所以我给它投上一票。在回答我关于我的函数为什么失败的问题时,我的回答是,它与Windows无关。问题是Windows机器上的文件在键中有一些重复,导致函数失败。

代码语言:javascript
复制
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)。因为一个对象不能有两次相同的键,所以它会导致函数死掉。

感谢大家的回应!

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/36731411

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档