如何用更好的方式编写这个javascript方法?

时间:2016-03-17 04:53:46

标签: javascript

你能改进吗? (声明多个数组,如果条件和推送太多,是否有任何方法可以将所有这些组合在一起?

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记录。

enter image description here

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,
        ...
        ...
        ...
    },
    ...
    ...
    ...

如果解决方案具有更好的性能,那将非常有用,因为我们处理的数据非常庞大。

3 个答案:

答案 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

&#13;
&#13;
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;
&#13;
&#13;