在es6中因为...的出现,使得数组或者对象的处理十分简便

//Array
let a = [1,2,3],
    b = [4,5,6],
    c = [...a,...b]     //[1,2,3,4,5,6]
//Object
let a = {name : '小明'},
    b = {height : 176},
    c = {...a,...b}     //{name: '小明', height: 176 }

所以经常有使用...结合循环(for, map, forEach, reduce···)来进行一些操作

例如调整数据,去重,对象属性合并等等

//调整数组[[1,2,3],[4,5,6],[7,8,9]] > [1,2,3,4,5,6,7,8,9]
let arr1 = [[1,2,3],[4,5,6],[7,8,9]]
let arr2 = arr1.reduce((r,c) => [...r,...c],[])     //[1,2,3,4,5,6,7,8,9]

//数组[1,1,1,2,2,2,3,3,3]对象法去重
let arr1 = [1,1,1,2,2,2,3,3,3]
let arr2 = Object.values(arr1.reduce((r,c) => r = {...r,[c]: c},{}))     //[1,2,3]

但近日笔者在使用nodejs处理大量的数据时,约25万个item的arr,arr如调整数组中的例子

nodejs执行后直接一直处于计算状态,笔者等了10min都还没计算结束

但将循环中的...过程修改为.push(),则基本一两秒钟就可以计算完毕

经过分析得知,由于大量的数据处理,在每一次循环中,...都会将数据拆解,并且使用[]合并。在大量的数据运算下,性能极其不好

所以笔者推荐

少量的数据的情况下,可以使用...在循环中直接拆解合并,来使代码结构更加简单美观

大量的数据中,推荐使用传统的push等操作,来增加性能

上面例子,增加性能的方式修改:

//调整数组[[1,2,3],[4,5,6],[7,8,9]] > [1,2,3,4,5,6,7,8,9]
let arr1 = [[1,2,3],[4,5,6],[7,8,9]]
let arr2 = arr1.reduce((r,c) => {
    r.push(...c)
    return r
},[])     //[1,2,3,4,5,6,7,8,9]

//数组[1,1,1,2,2,2,3,3,3]对象法去重
let arr1 = [1,1,1,2,2,2,3,3,3]
let arr2 = Object.values(arr1.reduce((r,c) => {
    r[c] = c
    return r
},{}))     //[1,2,3]
Last modification:March 17th, 2019 at 03:38 pm
If you think my article is useful to you, please feel free to appreciate