使用ES6新语法代替Lodash之Array系列

676 阅读3分钟

Lodash对于JavaScript来说是一个非常强大而且方便的第三方工具库,同时它也带来一个严重的副作用那就是代码体积急剧膨胀。虽然我们可以使用webpack这样的打包工具来剔除一些不使用的Lodash方法,但是依旧还是有些大。现在随着JavaScript ES6标准的广泛使用,我们可以将一些Lodash中的工具方法使用ES6的语法来自己实现,这样不仅减少了成品代码的体积,还能享受到原生代码所带来的性能的提升,这里我讲分享一些我对Lodash中的一些方法是如何用ES6语法来代替的使用心得,如有更好的建议也欢迎留言提醒。

由于Lodash是一个庞大的工具库,因此我也将分批的介绍,对于一些我还没有想到如何使用ES6更方便实现的方法我讲暂时不会贴出来,因为我们使用Lodash的初衷就是为了更方便和更快捷的编写代码,如果使用了ES6之后效率降低了那就与原来的愿景背道而驰了。

Array.concat()

Lodash版本

var array = [1];
var other = _.concat(array, 2, [3], [[4]]);
 
console.log(other);
// => [1, 2, 3, [4]]
 
console.log(array);
// => [1]

ES6语法实现

var array = [1];
var other = [...array, 2];
console.log(other);
// => [1, 2]

相对于Lodash来说ES6的版本是无法对数组做一个扁平化处理的,但是需要这种扁平化处理的情况并不多见,假如真的需要扁平化操作也可以使用ES6新的数组实例方法Array.prototype.flat方法来实现数组扁平化。

Array.fill()

这个方法是是使用指定的value来填充或者替换原来数组中的值,这里我做了一个处理那就是不该动原来的数组,而是重新生成一个数组的方式解决。

Lodash版本

var array = [1, 2, 3];
 
_.fill(array, 'a');
console.log(array);
// => ['a', 'a', 'a']
 
_.fill(Array(3), 2);
// => [2, 2, 2]
 
_.fill([4, 6, 8, 10], '*', 1, 3);
// => [4, '*', '*', 10]

ES6语法版

const array = [1, 2, 3];
const b = [...Array(array.length)].map(() => 'a'));
console.log(b)
// => ['a', 'a', 'a']

const c = [...Array(3)].map(() => 2);
console.log(c)
// => [2, 2, 2]

//
// 这里使用reduce方法实现,代码复杂度比较高,不如使用lodash实现的方便
// reduce参数解释
// T 是reduce的结果集
// c 代表当前数组遍历到的元素
// idx 代表当前数组遍历到的索引号,起始位0
//
const d = [4, 6, 8, 10].reduce((T, c, idx) => {
	T = [...T, idx >= 1 || idx < 3 ? '*' : c];
}, [])
console.log(d)
// => [4, '*', '*', 10]

Array.uniq()

这个方法是返回一个唯一值的数组,也就是说这个数组中不会出现两个相同的元素

Lodash版本

_.uniq([2, 1, 2]);
// => [2, 1]

ES6语法版

const a = [...new Set([2, 1, 2])];
// => [2, 1]

这里使用到了ES6中的新的数据对象Set,这个数据对象与数组类似,但是处理效率要比数组要高,同时与数组有一个最大的区别就是Set是一个无序的集合,并且也没有Hash映射,但是大部分情况下Set中的数据排列与我们输入的数据顺序是一致的,同时它会将两个相同的值做唯一化处理,也就是利用这个特性我们实现了数组的唯一化操作,并且因为是使用了JS引擎来实现所以理论上处理速度会比Lodash的要快。

今天先介绍这三个代替方法,之后我会将想到的其他方法放上来与大家分享