在学习JavaScript的一些总结和经验,供大家参考和学习,同时也欢迎大家参与讨论。
前言:数组去重,一般都是在面试的时候才会碰到,一般是要求手写数组去重方法的代码。如果是被提问到,数组去重的方法有哪些?你能答出其中的10种,面试官很有可能对你刮目相看。
在真实的项目中碰到的数组去重,一般都是后台去处理,很少让前端处理数组去重。虽然日常项目用到的概率比较低,但还是需要了解一下,以防面试的时候可能回被问到。
先看一道题目:
编写一个Javascript函数,传入一个数组,对数组中的元素进行去重并返回一个无重复元素的数组,数组的元素可以是数字、字符串、数组和对象。举例说明:
- 如传入的数组元素为[123, “meili”, “123”, “mogu”, 123],则输出:[123, “meili”, “123”, “mogu”]
- 如传入的数组元素为[123, [1, 2, 3], [1, “2”, 3], [1, 2, 3], “meili”],则输出:[123, [1, 2, 3], [1, “2”, 3], “meili”]
- 如传入的数组元素为[123, {a: 1}, {a: {b: 1}}, {a: “1”}, {a: {b: 1}}, “meili”],则输出:[123, {a: 1}, {a: {b: 1}}, {a: “1”}, “meili”]
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34 var arr = [
123,
{a: 1},
{a: {b: 1}},
{a: "1"},
{a: {b: 1}},
"meili",
{ b: 1, a: 2},
{a: 2, b: 1}
];
function unique(arr) {
let hash = new Map();
let result = [];
let item = null;
let toStr = Object.prototype.toString;
for (let i = 0; i < arr.length; i++) {
if (toStr.call(arr[i]) === '[object Object]' || toStr.call(arr[i]) === '[object Array]') {
item = JSON.stringify(arr[i]);
} else {
item = arr[i];
}
if (!hash.has(item)) {
hash.set(item, true)
result.push(arr[i]);
}
}
return result;
}
// 或
function removeDuplicate(arr) {
return [...(new Set(arr.map(n => JSON.stringify(n))))].map(n => JSON.parse(n));
}
console.log(unique(arr));
数组去重的方法
一、利用ES6 Set去重(ES6中最常用)
1 | <script type="text/javascript"> |
不考虑兼容性,这种去重的方法代码最少。这种方法还无法去掉“{}”空对象,后面的高阶方法会添加去掉重复“{}”的方法。
二、利用for嵌套for,然后splice去重(ES5中最常用)
1 | <script type="text/javascript"> |
双层循环,外层循环元素,内层循环时比较值。值相同时,则删去这个值。
想快速学习更多常用的ES6语法,可以看我之前的文章《学习ES6笔记──工作中常用到的ES6语法》。
三、利用indexOf去重
1 | function unique(arr) { |
新建一个空的结果数组,for 循环原数组,判断结果数组是否存在当前元素,如果有相同的值则跳过,不相同则push进数组。
四、利用sort()
1 | function unique(arr) { |
利用sort()排序方法,然后根据排序后的结果进行遍历及相邻元素比对。
五、利用对象的属性不能相同的特点进行去重
1 | function unique(arr) { |
六、利用includes
1 | function unique(arr) { |
七、利用hasOwnProperty
1 | function unique(arr) { |
利用hasOwnProperty 判断是否存在对象属性
八、利用filter
1 | function unique(arr) { |
九、利用递归去重
1 | function unique(arr) { |
十、利用Map数据结构去重
1 | function arrayNonRepeatfy(arr) { |
创建一个空Map数据结构,遍历需要去重的数组,把数组的每一个元素作为key存到Map中。由于Map中不会出现相同的key值,所以最终得到的就是去重后的结果。
十一、利用reduce+includes
1 | function unique(arr) { |
十二、[…new Set(arr)]
1 | [...new Set(arr)] |
PS: 有些文章提到了foreach+indexOf数组去重的方法,个人觉得都是大同小异,所以没有写上去。 END
作者注:写的匆忙,加上这几天有点忙,还没有非常认真核对过,不过思路是没有问题,可能一些小细节出错而已。
文章标题: JavaScript数组去重
文章作者: 王奕聪,QQ:1301842163
许可协议:
©署名-非商用-相同方式共享 4.0
