1

重複の可能性:
javascriptのオブジェクトの配列から重複を削除します

var arr = [{empID:100,empName:greg},{empID:101,empName:Math},{empID:100,empName:greg}];
var sorted_arr = arr.sort(); // You can define the comparing function here. 
                             // JS by default uses a crappy string compare.
var results = [];
for (var i = 0; i < arr.length - 1; i++) {
    if (sorted_arr[i + 1].empID != sorted_arr[i].empID) {
        results.push(sorted_arr[i]);
    }
}

alert(results);

オブジェクトの配列がありますが、IDに一致する重複オブジェクトを削除しようとしても、削除されません。コードの問題は何ですか。

4

3 に答える 3

13

コードには 2 つの問題があります。

  1. 並べ替えは実​​際には機能しません
  2. 結果に最後の要素を追加するのを忘れた

次の代替案をお勧めします。

var arr = ...;
arr.sort( function( a, b){ return a.empID - b.empID; } );

// delete all duplicates from the array
for( var i=0; i<arr.length-1; i++ ) {
  if ( arr[i].empID == arr[i+1].empID ) {
    delete arr[i];
  }
}

// remove the "undefined entries"
arr = arr.filter( function( el ){ return (typeof el !== "undefined"); } );
于 2012-12-06T12:50:20.503 に答える
6

文字列または数値であることempIDが保証されている場合は、並べ替えの手順をスキップして、既に表示されているIDのハッシュとしてオブジェクトを使用します。

var arr = [
    {empID:100,empName:"greg"},
    {empID:101,empName:Math},
    {empID:100,empName:"greg"}
];

var results = [];
var idsSeen = {}, idSeenValue = {};
for (var i = 0, len = arr.length, id; i < len; ++i) {
    id = arr[i].empID;
    if (idsSeen[id] !== idSeenValue) {
        results.push(arr[i]);
        idsSeen[id] = idSeenValue;
    }
}
于 2012-12-06T13:05:33.250 に答える
1

アイテムsortを比較する場合、関数は実際にコンパレータを使用する必要がありますn and n+1

var sorted_arr = arr.sort(function(a,b) { return a.empID - b.empID; } );

このようにして、リスト内の連続する項目が重複するプロパティを持つ可能性があることを保証できempIDます。

于 2012-12-06T12:50:02.217 に答える