アナログCPU:5108843109

ゲームと音楽とプログラミング(酒と女とロックンロールのノリで)

('ω') < イザユケエンジニャー

連想配列に含まれる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"},