我正在从文本文件中读取数据,如下所示:
#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"在循环中,没有指定键(在这种情况下为20000
和29999
)。
你们有什么建议吗?
答案 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"
]
]
]