你能改进吗? (声明多个数组,如果条件和推送太多,是否有任何方法可以将所有这些组合在一起?
prepareGroupMarkers: function(groups){
var groupLevels = new Array();
var level1 = [],
level2 = [],
level3 = [],
level4 = [],
level5 = [];
for(var i = 0; groups.length > i; i++){
if(groups[i].level == 1) {
level1.push(groups[i]);
} else if(groups[i].level == 2) {
level2.push(groups[i]);
} else if(groups[i].level == 3) {
level3.push(groups[i]);
} else if(groups[i].level == 4) {
level4.push(groups[i]);
} else if(groups[i].level == 5) {
level5.push(groups[i]);
}
}
var pluginArrayArg = new Array();
pluginArrayArg.push(level1);
pluginArrayArg.push(level2);
pluginArrayArg.push(level3);
pluginArrayArg.push(level4);
pluginArrayArg.push(level5);
var jsonArray = JSON.parse(JSON.stringify(pluginArrayArg))
return jsonArray;
},
感谢您的所有回复!!
这是我的场景,我的JSON中有大量值(它基于树结构构建,如下图所示)。并且编写上述方法以获得每个级别的组。实际的json结构是如此巨大,它将具有> 20K记录。
groups":[
{
"latitude": 10.44333333333,
"longitude": 77.55,
"level": 1,
...
...
...
},
{
"latitude": 16.347745,
"longitude": 77.684620,
"level": 4,
...
...
...
},
{
"latitude": 16.34333333333,
"longitude": 77.45,
"level": 1,
...
...
...
},
{
"latitude": 16.34333333333,
"longitude": 77.45,
"level": 2,
...
...
...
},
...
...
...
如果解决方案具有更好的性能,那将非常有用,因为我们处理的数据非常庞大。
答案 0 :(得分:1)
一些小修复:使用开关保存一些周期,推送可以单行完成。如下所示:
prepareGroupMarkers: function(groups){
var groupLevels = new Array();
var level1 = [], level2 = [], level3 = [], level4 = [], level5 = [];
for(var i = 0; groups.length > i; i++){
switch(groups[i].level)
{
case 1:
level1.push(groups[i]);
break;
case 2:
level2.push(groups[i]);
break;
case 3:
level3.push(groups[i]);
break;
case 4:
level4.push(groups[i]);
break;
case 5:
level5.push(groups[i]);
break;
}
}
var pluginArrayArg = new Array();
pluginArrayArg.push(level1, level2, level3, level4, level5);
var jsonArray = JSON.parse(JSON.stringify(pluginArrayArg))
return jsonArray;
}
答案 1 :(得分:0)
您可以拥有一个数组数组,并根据level
属性的值将值推送到数组
我假设您正在使用JSON.parse(JSON.stringify())
制作对象的深层副本(可能并不总是有效),否则您可以直接返回pluginArrayArg
var obj = {
prepareGroupMarkers: function(groups) {
var pluginArrayArg = [
[],
[],
[],
[],
[]
];
for (var i = 0; groups.length > i; i++) {
pluginArrayArg[groups[i].level - 1].push(groups[i]);
}
return JSON.parse(JSON.stringify(pluginArrayArg));
}
}
var array = obj.prepareGroupMarkers([{
level: 1
}, {
level: 5
}, {
level: 2
}, {
level: 2
}, {
level: 4
}, {
level: 4
}, {
level: 1
}, {
level: 5
}, {
level: 1
}]);
result.innerText = JSON.stringify(array, null, 2);
<pre id="result"></pre>
答案 2 :(得分:0)
是的,确实如此,请使用reduce
function prepareGroupMarkers(groups) {
var levels = groups.reduce(function (prev, cur) {
var curLevel = cur.level - 1;
prev[curLevel] = prev[curLevel] || [];
prev[curLevel].push(cur);
return prev;
}, []);
var pluginArrayArg = [];
Array.prototype.push.apply(pluginArrayArg, levels);
return pluginArrayArg;
};
document.write(JSON.stringify(prepareGroupMarkers([{level: 1}, {level: 2}, {level: 1}, {level: 3}, {level: 4}, {level: 5}, {level: 3}])));
&#13;