連想配列に含まれるIDを使ってユニーク化する関数
を作ったのでメモ。
function uniqAry(ary){ // idの値で昇順ソートする ary.sort(function(a, b){ return a.id > b.id; }); // 重複しているIDがあれば後に出てきた方を削除(undefinedにする) var tmpid = 0; $(ary).each(function(i, e){ if (e.id == tmpid){ delete ary[i]; } else{ tmpid = e.id; } }); // undefined(削除した項目)を除いたものを返す return ary.filter(function(v){ return v != undefined; }); }
配列に必ず0でない数値の「id」が含まれているという前提。
配列に含まれる「id」でソートして、
ソート後配列を順番に見て前レコードと同じIDだったら削除しています。
spliceで要素を削除するとループがめんどくさいことになるので、deleteでundefined化してからfilterしています。
例えば以下のようなのを実行すると
var ary = [ {id: 1, name:"name1_1"}, {id: 3, name:"name3_1"}, {id: 1, name:"name1_2"}, {id: 2, name:"name2_1"}, {id: 3, name:"name3_2"}, ]; console.log( uniqAry(ary) );
こうなります。
{id: 1, name:"name1_1"}, {id: 2, name:"name2_1"}, {id: 3, name:"name3_1"},