for
ES678
まずは配列から。
var baseArray = [1, 1, '1', '1', null, null,
undefined, undefined,
new String('1'), new String('1'),
/a/, /a/,
NaN, NaN
];
set
let unique_1 = arr => [...new Set(arr)];
console.log(unique_1(baseArray));
輸出
[1, "1", null, undefined, String, String, /a/, /a/, NaN]
filter
let unique_2 = arr => {
let res = arr.filter((item, index, array) => {
return array.indexOf(item) === index; // 配列内の現在の要素の最初の出現に対して真を返す。
})
return res;
}
console.log(unique_2(baseArray));
輸出
[1, "1", null, undefined, String, String, /a/, /a/]
これは、Array.indexOf(NaN)の値が-1であるため、NaNをフィルタリングします。
reduce
let unique_3 = arr => arr.reduce((pre, cur) => pre.includes(cur) ? pre : [...pre, cur], []);
console.log(unique_3(baseArray));
輸出
[1, "1", null, undefined, String, String, /a/, /a/, NaN]
原理は通常のforループと同じで、最初に空の配列を宣言し、includesがfalseの場合、現在の要素をプッシュします。
キーと値のペア
let unique_4 = arr => {
let obj = {};
return arr.filter(item => Reflect.has(obj, typeof item + item) ? false : (obj[typeof item + item] = true));
}
console.log(unique_4(baseArray))
輸出
[1, "1", null, undefined, String, /a/, NaN]
ある意味、完璧なやり方です。
obj[typeof item + item] write reason: オブジェクトのキーは文字列でなければなりません。