js数组去重利用set

JavaScript030

js数组去重利用set,第1张

const nums = [1,2,3,4,3,2,1]

uniq1 = [...new Set(nums)]

uniq2 = Array.from(new Set(nums))

定义:新数据结构Set,类似于数组,但成员值不重复

使用: new Set()

ps:New Set() 接受一个数组或类数组对象,在Set内部, NAN相等,两个对象不等,可以用length检测,可以用for...of遍历

size:返回值的个数

add(val):添加值,返回set结构;

delete(val):删除值,返回布尔值

has(val):是否包含,返回布尔值

clear():清除所有成员,无返回值

与set类似,也是不重复值的集合

与set的区别:1.weakset 成员只能是对象,对象都是弱引用,垃圾回收机制不考虑,不可遍历

定义:类似于对象,也是键值dui的集合,但键可以是各种类型(键可以为对象),两个键严格相等才为同一个键。

Var m = new Map(), o = {1:2}

m.set(o, ‘hi’)

m.get(o)

m.has(o) //只有对同一个对象的引用才是同一个键

size:返回值的个数

set(key, val):添加值,返回Map结构;

Get(key): 获取值,返回val

Has(key):是否包含,返回布尔值

Delete(key):删除值,返回布尔值

Clear():清除所有成员,无返回值

定义:把泪数组对象和有iterator接口的对象(Set Map Array)转化为数组

使用:Array.from(arrayLike[, mapFn[, thisArg]]) 参数:类数组,处理函数map,map中的this指向的对象

Array.from([1, 2, 3, 4, 5], (n) =>n + 1) // 每个值都加一

const map = new Map()

map.set(‘k1’, 1)

map.set(‘k2’, 2)

Const a = Array.from(map) // [[‘k1’,1], [‘k2’, 2]]

const set1 = new Set()

Set1.add(1).add(2).add(3)

Var a = Array.from(set1) // [1,2,3]

console.log('%s', Array.from('hello world’)) //["h", "e", "l", "l", "o", " ", "w", "o", "r", "l", "d"]

console.log('%s', Array.from('\u767d\u8272\u7684\u6d77’)) //["白", "色", "的", "海"]

var a = {0:1, 2:3, 4:5, length: 5}var b = {0:1, 2:3, 4:5, length: 3}

Array.from(a) // [1,undefined,3,undefined,4]

Array.from(b) // [1,undefined,3]

方法一:indexOf循环去重

方法二:ES6 Set去重;Array.from(new Set(array))

方法三:Object 键值对去重;把数组的值存成 Object 的 key 值,比如 Object[value1] = true,再判断另一个值的时候,如果 Object[value2]存在的话,就说明该值是重复的。

所谓数组扁平就是将多维数组拍扁,变成一维数组,在面试中也是常常问到的问题,方法如下:

我们首先使用一个二维数组进行举例,更多维的操作一致

const array = [[1,2,3],4,[5,6]]

1.调用flat专门方法

array.flat(Infinity)//[1,2,3,4,5,6]

2.Array.from配合toString、split方法

const arr =  Array.from(new Set(array.toString().split(','))).sort((a,b)=>a-b)//[‘1’,'2','3','4','5','6']

3.利用map实现处理

const arr = array.join(',').split(',').map((item)=>{return parseInt(item)})//[1,2,3,4,5,6]

4.既然map可以,我reduce也可以

使用reduce+concat

const arr = array.reduce((pre,cur)=>{return pre.concat(cur)})//[1,2,3,4,5,6]

5.ES6扩展运算符

俗话说,扩展在手,数组不愁

const arr = [].concat(...array)//[1,2,3,4,5,6]

当然实际应用中多半会封装函数,因为直接应用只能降一维,但原理是一样的。目前想到的就这么多,有问题大家可以提出互相交流o( ̄ヘ ̄o#)

3.11添加一个对象扁平化方法

数组都写了,最近学了对象扁平化,看看面试用不用的上......

const obj={

  a:13,

  b:565,

  c:{d:'yo',e:3},

  f:[{g:true,h:5}],

  i:'911'

}

好像不能有空对象值,可以用Object.prototype.toString.call(null)来判断,空对象还是麻烦o(╯□╰)o