JavaScript数组去重

数组去重,通常都是在面试的时候才会碰到,通常是要求手写数组去重方法的代码。若是是被提问到,数组去重的方法有哪些?你能答出其中的10种,面试官颇有可能对你另眼相看。
在真实的项目中碰到的数组去重,通常都是后台去处理,不多让前端处理数组去重。虽然平常项目用到的几率比较低,但仍是须要了解一下,以防面试的时候可能回被问到。前端

1、利用ES6中的set方法去重(ES中最经常使用)面试

var arr = [1,2,3,3,false,false,false,true,true,4,undefined,null,null,55,NaN];

function fun(arr){
  var num = Array.from(new Set(arr));
  console.log(num); //[1, 2, 3, false, true, 4, undefined, null, 55, NaN]
}			
fun(arr);

下面咱们介绍一下用到的方法:数组

第一个方法就是数组的from方法--Array.from();spa

数组的from方法能够把一个类数组(伪数组)或者可遍历(可循环)的对象转化成一个真正的数组,例如code

var a = {
	0: 'a',
	1: '90',
	2: '88',
	3: ['mm', 'nn', 'hh'],
	'length': 4 // 不带引号直接 length: 4 也是行的
}
var b = Array.from(a);
console.log(b) // ['a','90','88',['mm','nn','hh']]

假如咱们把a对象中的 'length': 4 代码去掉会出现什么状况?或者把 'length': 4 中的4变成0呢?对象

var a = {
	0: 'a',
	1: '90',
	2: '88',
	3: ['mm', 'nn', 'hh']
}
var b = Array.from(a);
console.log(b) // []
var a = {
	0: 'a',
	1: '90',
	2: '88',
	3: ['mm', 'nn', 'hh'],
        'length': 0
}
var b = Array.from(a);
console.log(b) // []

没想到这两段代码获得的居然都是一个空数组!!!字符串

从这咱们就能够看出要想把一个类数组转化成一个真正的数组,该类数组就必需要具备length属性,而且length属性还得有指定得长度,若是没有length属性或length属性得值为0,那么获得得就是一个空数组。io

假如咱们把类数组对象的属性名由数值型变成字符串型的数字会出现什么样的结果呢?console

var a = {
		  '0': 'a',
		  '1': '90',
		  '2': '88',
		  '3': ['mm', 'nn', 'hh'],
		  'length': 4
}
var b = Array.from(a);
console.log(b) //['a','90','88',['mm','nn','hh']]

这个例子告诉咱们其实类数组对象的属性名为字符串型的数字也是能够的!!!!function

var a = { //第一种状况
		'a': 'a',
		'b': '90',
		'c': '88',
		'd': ['mm', 'nn', 'hh'],
		'length': 0
}
var b = Array.from(a);
console.log(b) // []

var a = { //第二种状况
		a: 'a',
		b: '90',
		c: '88',
		d: ['mm', 'nn', 'hh'],
		'length': 0
}
var b = Array.from(a);
console.log(b) // []

像上面这两种状况获得的都是空数组!!!!!

因而可知,将一个类数组对象转化为一个真正的数组 ,必须具有如下条件:

(1)该类数组对象必须具有length属性,用于指定数组的长度;若是没有length属性,那么转换后的数组就是一个空数组

(2)该类数组对象的属性名必须为数值型或字符串型的数字

注:该类数组对象的属性名能够加引号,也能够不加引号

第二个方法就是set方法:这个方法的做用就是去重,这也是个集合的方法,咱们都知道集合它有个特色就是无重复性,因此用它来达到去重的目的。

相关文章
相关标签/搜索