たくさんの文字列が配列に入っていて、重複しているとき、ユニークにまとめたいことがあります。
例えば以下のような配列があったとします。
["10,3,2", "10,3,3", "10,3,3", "10,3,4", "10,3,4", "10,3,5", "10,3,5", "10,3,5", "10,4,2", "10,4,5", "100,0,13", "100,1,11", "100,10,14", "100,101,95", "100,11,19", "100,12,17", "100,2,13", "100,2,15", "100,30,20", "100,33,23", "100,34,20", "100,34,23", "100,35,20"]
ここにでてくる文字列の重複があったら、一つにまとめてさらにカウントをするサンプルです。
つまり、以下のような配列を新たに作ります。
0: {color: "10,3,5", cnt: 3} 1: {color: "10,3,3", cnt: 2} 2: {color: "10,3,4", cnt: 2} 3: {color: "10,3,2", cnt: 1} 4: {color: "10,4,2", cnt: 1} 5: {color: "10,4,5", cnt: 1} 6: {color: "100,0,13", cnt: 1} 7: {color: "100,1,11", cnt: 1} 8: {color: "100,10,14", cnt: 1} 9: {color: "100,101,95", cnt: 1} 10: {color: "100,11,19", cnt: 1} 11: {color: "100,12,17", cnt: 1} 12: {color: "100,2,13", cnt: 1} 13: {color: "100,2,15", cnt: 1} 14: {color: "100,30,20", cnt: 1} 15: {color: "100,33,23", cnt: 1} 16: {color: "100,34,20", cnt: 1} 17: {color: "100,34,23", cnt: 1} 18: {color: "100,35,20", cnt: 1}
JSは以下です。
//初期の値 array_elements = ["10,3,2", "10,3,3", "10,3,3", "10,3,4", "10,3,4", "10,3,5", "10,3,5", "10,3,5", "10,4,2", "10,4,5", "100,0,13", "100,1,11", "100,10,14", "100,101,95", "100,11,19", "100,12,17", "100,2,13", "100,2,15", "100,30,20", "100,33,23", "100,34,20", "100,34,23", "100,35,20"]; var current = null; var cnt = 0; uniq_arr = []; ii=0; for (var i = 0; i < array_elements.length; i++) { if (array_elements[i] != current) { if (cnt > 0) { uniq_arr[ii]={color:current,cnt:cnt} ii++; } current = array_elements[i]; cnt = 1; } else { cnt++; } } if (cnt > 0) { uniq_arr[ii]={color:current,cnt:cnt} ii++; }
ちなみに最後に降順にしたい場合、以下のような記述でいけます。
//降順 uniq_arr.sort(function(a,b){ if(a.cnt>b.cnt) return -1; if(a.cnt < b.cnt) return 1; return 0; });