トピックの説明
Array オブジェクトの重複を削除するメソッドを追加します
例:
输入:[false, true, undefined, null, NaN, 0, 1, {}, {}, 'a', 'a', NaN]
出力: [false, true, undefined, null, NaN, 0, 1, {}, {}, 'a']
答え
- Set 内のオブジェクトのプロパティを利用すると、
Set
任意の型の一意の値を格納できます(プリミティブ値またはオブジェクト参照)。NaN
と は どちらもundefined
Set に格納でき、NaN
同じ値として扱われます (NaN !== NaN ですが、NaN は同じと見なされます)。次に、Array.from() を使用して配列を作成します。Array.from()
配列オブジェクトは、次の方法で作成できます。疑似配列オブジェクト (
length
1 つのプロパティと複数のインデックス付きプロパティを持つ任意のオブジェクト)反復可能なオブジェクト (Map や Set など、オブジェクト内の要素を取得できます)
Array.prototype.uniq = function () {
return Array.from(new Set(this))
}
- 配列をトラバースし、新しい配列に要素を追加し、追加時に追加されたかどうかを判断します。注: ①NaN は、それ自体を含め、何とも等しくありません; ②var objA = {}; var objB = {}; console.log(objA == objB); も等しくありませんが、タイトルは削除する必要はありません; ③arr[i ]= {}; arr.indexOf(arr[i]) == i.
1.トラバースするとき、現在の要素がそれ自体の要素で見つかるかどうかを確認します. NaN はそれ自体と等しくないため、見つけることができないため、arr.indexOf(arr[i]) = -1 の場合、NaN であることを意味します.遭遇します。NaN が繰り返されると重複排除が必要になるため、NaN が追加されたかどうかを判断するためにフラグ値が追加されます。
Array.prototype.uniq = function () {
var args = this;
var len = args.length;
var result = [];
var flag = true;
for (var i = 0; i < len; i++) {
if (args.indexOf(args[i]) != -1) { //NaN不等于任何,包括他自身,所以args.indexOf(args[i])遇到NaN永远返回-1
if (i === args.indexOf(args[i])) {
result.push(args[i]);
}
} else if (flag) {
result.push(args[i]);
flag = false;
}
}
return result
}
2. JavaScript の組み込みメソッドを使用して、要素 a が NaN かどうかを判断します。NaN を判断するには、次の 2 つの方法があります。
isNaN(a):
isNaN()
パラメータが Number 型でない場合、最初にパラメータを Number に変換するため、直接使用すると、文字列が渡されたときにも true が返されますisNaN('str'); // true
。Object.is(a, NaN): NaN のみ認識可能
Array.prototype.uniq = function () {
var arr = this;
var result = [];
var len = arr.length;
var flag = true
for (var i = 0; i < len; i++) {
var type = typeof arr[i]
if (flag && Object.is(arr[i], NaN)) {
result.push(arr[i]);
flag = false;
} else if (result.indexOf(arr[i]) == -1 && !Object.is(arr[i], NaN)) {
result.push(arr[i]);
}
}
return result;
}