3

例として次のような配列がある場合:

myArray = [1,4,5,1,5];

すべての重複値 (この例ではすべての 1 と 5) を削除し、一意の要素 (この例では 4) のみを返すにはどうすればよいでしょうか。

どんな助けでも大歓迎です。

4

4 に答える 4

4

おもう

[1,4,5,1,5].filter(function(x, n, self) { 
    return self.indexOf(x) == self.lastIndexOf(x) 
})

アンダースコアを使用したおそらくより効率的なハッシュベースのバージョン:

a =[1, 2, 3, 3, 4, 2, 1, 5]
uniqs = _.chain(a).countBy().pairs().filter(function(x) {
    return x[1] == 1
}).pluck(0).value()

またはプレーンJavaScript:

a = [1, 2, 3, 3, 4, 2, 1, 5]
hash = {}

a.forEach(function(x) {
    hash[x] = (Number(hash[x]) || 0) + 1
});

uniq = Object.keys(hash).filter(function(n) {
    return hash[n] == 1
});

ただし、これは配列値を文字列に変換することに注意してください (結果は になります["4","5"])。

並べ替えられた配列に満足している場合は、次のようにすることもできます。

a = [1, 2, 3, 3, 4, 2, 1, 5]

uniq = a.sort().filter(function(x, n, self) {
    return x != self[n - 1] && x != self[n + 1];
});

//[4, 5]

2 番目と 3 番目の方法には、プリミティブ値でしか機能しないという重大な制限があります。オブジェクトの配列を「一意化」することはできません。最初の関数は問題なく動作します。

x = {x:1}; y = {y:1}; a = [x, y, x, x];
uniq = a.filter(function(x, n, self) { 
    return self.indexOf(x) == self.lastIndexOf(x) 
})
// {"y":1}

好奇心旺盛なパフォーマンス テスト (ブラウザによって一貫性がありません): http://jsperf.com/effective-unique/2

于 2013-08-21T20:55:59.363 に答える
1

これを試して:-

var arr = [1,4,5,1,5];
var sorted_arr = arr.sort(); 
var results = [];
for (var i = 0; i < arr.length - 1; i++) {
    if (sorted_arr[i + 1] !== sorted_arr[i]) {
        results.push(sorted_arr[i]);
    }
}
于 2013-08-21T20:54:35.837 に答える
0

このjquery関数を試してみてください: http://api.jquery.com/jQuery.unique/

「$.unique() 関数は、オブジェクトの配列を検索し、配列を並べ替えて、重複するノードを削除します。」

于 2013-08-21T20:51:55.427 に答える