从API解析文本并转换为对象

时间:2014-04-25 09:34:53

标签: javascript

我正在从文本文件中读取数据,如下所示:

#start
#p 09060 20131010
#p 09180 AK
#p 01001 19110212982
#end
#start
#p 09060 20131110
#p 09180 AB
#p 01001 12110212982
#end

将其解析为对象:

var result = data.match(/#start[\s\S]+?#end/ig).map(function(v){

    var lines = v.split('\n'),
        ret = {};

    $.each(lines, function(_, v2){
        var split = v2.split(' ');
        if(split[1] && split[2]) 
            ret[split[1]] = split[2];
    });

    return ret;
});

这会给我一个看起来像这样的对象列表:

[{ 09060: 20131010, 09180: 'AK' }, { 09060: 20131110, 09180: 'AB' }] //etc...

但是,我注意到每个条目都包含重复项,这会导致我的方法覆盖属性:

#start
#p 09060 20131110
#p 09180 AB
#p 01001 12110212982
#p 20000
#p 20001 ABC
#p 20002 123
#p 29999
#p 20000
#p 20001 CDE
#p 20002 345
#p 29999
#end

我想听听你的想法如何解决这个问题。我的第一个想法是识别" chunks"并在列表出现时创建列表,并创建如下属性:

{ 
    09060: 20131010, 
    09180: 'AK',
    20000_29999: [
        { 20001: 'ABC', 20002: 123 }, { 20001: 'CDE', 20002: 456 }
    ]
}

我不确定如何识别" chunk"在循环中,没有指定键(在这种情况下为2000029999)。

你们有什么建议吗?

2 个答案:

答案 0 :(得分:1)

使用数组来保存值。

var result = data.match(/#start[\s\S]+?#end/ig).map(function(v){

    var lines = v.split('\n'),
        ret = {};

    $.each(lines, function(_, v2){
        var split = v2.split(' ');
        if(split[1] && split[2]) {
           // use array to hold values
           ret[split[1]] ||= [];
           ret[split[1]].push(split[2]);
        }      
    });

    return ret;
});

答案 1 :(得分:0)

我想知道你将如何使用这个对象,你可以使用以下结构:

[
  {
    "20001": [
      "ABC",
      "CDE"
    ],
    "09060": "20131110"
  },
  {
    "20001": [
      "ABC",
      "CDE"
    ],
    "09060": "20131110"
  }
]

OR

[
  {
    "20001": {
      "ABC": 1,
      "CDE": 1
    },
    "09060": "20131110"
  },
  {
    "20001": {
      "ABC": 1,
      "CDE": 1
    },
    "09060": "20131110"
  }
]

OR

[
  [
    [
      "20001",
      "ABC"
    ],
    [
      "20001",
      "CDE"
    ],
    [
      "09060",
      "20131110"
    ]
  ],
  [
    [
      "20001",
      "ABC"
    ],
    [
      "20001",
      "CDE"
    ],
    [
      "09060",
      "20131110"
    ]
  ]
]