質問があるので、私たちの日々の開発に注力するJavaScriptの配列は、非常に一般的な問題として記述することができますか?すべてのどのような方法多用に問題の配列を解決するような?
図1に示すように、重量法に従います
私はJSを学ぶために始めたとき、一つの方法は、によると、同じオブジェクトが、それによって、使用する判断の同じ要素の存在を可能にする場合は、オブジェクトが上書きされます属性があるため、この方法は、初心者はまず、解決策を考えても、使用していました。
const unique = (arr) => {
let map = {};
let res = [];
for (let i = 0; i < arr.length; i++) {
if (!map[arr[i]]) {
map[arr[i]] = 1;
res.push(arr[i]);
}
}
return res;
}
重いのindexOfを使用するには、2、
法の原則のindexOfも重いと非常にシンプルですが、アクセスなしように、この要素の存在は、すでに繰り返される要素ことを示している場合、配列インデックス、アレイメモリに従って決定すること。
const unique = (arr) => {
let res = [];
for (let i = 0; i < arr.length; i++) {
if (res.indexOf(arr[i]) < 0) {
res.push(arr[i]);
}
}
return res;
}
3、および指標値決意を用いてのindexOf
インデックス値とインデックス値が等しくない場合は、IndexOfメソッドのindexOfインデックスの現在値との判断の指標に応じて、判断するために使用され、反復エレメントの存在を示す、除去することができます。
const unique = (arr) => {
let res = [];
for (let i = 0; i < arr.length; i++) {
if (arr.indexOf(arr[i]) == i) {
res.push(arr[i]);
}
}
return res;
}
4、および指標値決意を用いてのlastIndexOf
そして、同様の原理で、代わりに使用します
const unique = (arr) => {
let res = [];
for (let i = 0; i < arr.length; i++) {
if (arr.lastIndexOf(arr[i]) == i) {
res.push(arr[i]);
}
}
return res;
}
図5に示すように、ラウンドロビン二十から二の数
反復を除去した場合、繰り返しの数(予めアレイをソートする)かどうかを判定する二つの隣接を使用して一サイクル
const unique = (arr) => {
let res = [];
// 需要先排序
arr.sort((a, b) => a - b);
res[0] = arr[0];
for (let i = 1; i < arr.length; i++) {
if (arr[i] !== arr[i - 1]) {
res.push(arr[i]);
}
}
return res;
}
図6に示すように、この方法は、アレイ(ES6ためのA新しい方法)の使用を含みます
追加する必要がない場合、一時的に、アレイ内が記憶されているか否かを決定するための方法を含みます
const unique = (arr) => {
let res = [];
for (let i = 0; i < arr.length; i++) {
if (!res.includes(arr[i])) {
res.push(arr[i]);
}
}
return res;
}
フィルタ関数のアレイを使用して7は、+のindexOfを決定します
フィルタアレイを用いる方法がトラバースされると、インデックス値のindexOfを判断します
const unique = (arr) => {
return arr.filter((item, index, _arr) => {
return _arr.indexOf(item) === index;
})
}
8、スプライス重複除外
直接元の配列のメソッドのスプライス配列することによって、あなたは元の配列を変更しない場合は、あなたがコピーする必要があることに注意することに変更すると、そのメソッドにすることができ
const unique = (arr) => {
arr.sort((a, b) => a - b);
for (let i = 0; i < arr.length - 1; i++) {
if (arr[i + 1] === arr[i]) {
arr.splice(i, 1);
i--;
}
}
return arr;
}
9、再使用地図のデータ構造
重複除外は、非再現マップの操作に応じて実行することができるが、それは特定の記憶喪失を必要とします。
const unique = (arr) => {
let res = [];
let map = new Map();
for (let i = 0; i < arr.length; i++) {
if (!map.has(arr[i])) {
res.push(arr[i]);
map.set(arr[i], true);
}
}
return res;
}
重い(ES6のための新しい方法)の使用を減らすために10、
コードは簡単ですあなたは法に精通していない小規模なパートナーを減らすこの方法を見て学ぶことを使用できるかどうか実際に偉大な使用の場合は、この方法が良いです。
const unique = (arr) => {
return arr.reduce((prev, cur) => prev.includes(cur) ? prev : [...prev, cur], []);
}
11、データ構造を再利用セットに
これは、使いやすい、ES6、簡単で便利な後の再学習する方法に少量のコードを使用することができます
const unique = (arr) => {
return [...new Set(arr)];
}
そのような言葉の配列として再複雑な構造へのニーズも再構成設定するために使用することができる場合
let arr = [1, {a: 1, b: 2}, [1, 2, 3], {a: 1, b: 2}, [1, 2, 3]
const unique = (arr) => {
return [...new Set(arr.map(item => JSON.stringify(item)))].map(item => JSON.parse(item));
}
上記のコードは、単純な配列演算重複排除にのみ適用されます
最後に書かれました
より多くの方法なので、私たちは、さまざまなシナリオ、時間の複雑さと、このような頻繁に考慮する必要があるのスペースの複雑さに応じてさまざまな方法を使用することができます。時間のためのスペースの時間やスペースのためのさまざまなニーズに応じて選択すること。