谁把年华错落成诗 - ...性能
type: channel
link: https://blog.pomears.com/tag/%E6%80%A7%E8%83%BD/
items: 关于es6的...扩展运算符在循环过程中使用的性能问题

关于es6的...扩展运算符在循环过程中使用的性能问题
type: item
date: 2019-03-17T15:34:00+08:00
description: 在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]