例として次のような配列がある場合:
myArray = [1,4,5,1,5];
すべての重複値 (この例ではすべての 1 と 5) を削除し、一意の要素 (この例では 4) のみを返すにはどうすればよいでしょうか。
どんな助けでも大歓迎です。
例として次のような配列がある場合:
myArray = [1,4,5,1,5];
すべての重複値 (この例ではすべての 1 と 5) を削除し、一意の要素 (この例では 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
これを試して:-
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]);
}
}
このjquery関数を試してみてください: http://api.jquery.com/jQuery.unique/
「$.unique() 関数は、オブジェクトの配列を検索し、配列を並べ替えて、重複するノードを削除します。」