2016-03-17 67 views
0

你能改進嗎? (聲明多個數組,如果條件和推送太多)有什麼辦法可以將所有這些組合在一起?如何用更好的方式寫這個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, 
     ... 
     ... 
     ... 
    }, 
    ... 
    ... 
    ... 

這將是真正有用的,如果解決方案具有更好的性能,因爲我們正在處理的數據確實非常大。

+1

你爲什麼一切都分手了,如果你剛剛結束了在同一陣列中推動一切反正呢?要根據級別進行排序? –

回答

0

我假設你沒有使用ES6或其他現代JS,所以我會改寫它是舊的skool。我也假設1 <= level >= 5

prepareGroupMarkers: function(groups) { 
    var result= [[],[],[],[],[]]; 
    for (var i= 0; i < groups.length; ++i) { 
     result[groups[i].level-1].push(groups[i]); 
    } 
    return result; 
} 

這應該會得到相同的結果。順便說一句,而不是new Array()只是使用[]。另外,爲什麼stringify然後解析?沒有目的。

編輯: 既然你這麼問,這裏是ES6當量(再採用一個固定的5級輸出):

function prepareGroupMarkers_ES6(groups) { 
    return groups.reduce((result, item) => { 
    result[item.level - 1].push(item); 
    return result; 
    }, [[],[],[],[],[]]); 
} 
+0

如何在ES6中寫這個? –

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>

+0

'JSON.parse(JSON.stringify())'嚴重嗎? –

+0

@MedetTleukabiluly可以做一個對象的深層副本 –

+0

我沒有看到在這個當前的實現中的點 –

0

一些小的修正:使用開關保存一些週期,並推動可一條線完成。類似下面:

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; 
} 
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}])));

相關問題