本文属于JS中基础中的基础,但是工作中遇到了就记录一下
情景复现:
项目中遇到了两个数组
const arr1 = [ {name: 'zhangsan'}];
const arr2 = [ {age: 'lisi'}];
需要合并这两个数组,二话没说,直接来了一个cancat,但是得声明一个变量或者重新赋值(因为concat并不改变原始数组),对于我这种奇葩来说,多声明一个变量或者重新赋值倍感不优雅,由此......
- concat
let arr1 =[ 1,2,3];
let arr2 = ['a', 'b', 'c'];
let arr3 = Array.prototype.concat(arr1, arr2);
假如arr2是一个巨型数组,那么合并后,arr2 就会浪费了一个巨大的内存空间,不优秀啊!
- for 循环
for( let i = 0; i< arr1.length; i++) {
arr2.push(arr[1]);
};
如果arr2仍然是一个巨型数组,那么可以考虑使用小型数组进行遍历,合理使用push和unshift方法,但是for循环,不优雅啊!
- 拓展运算符
arr1.push(...arr2);
- reduce
arr2 = arr1.reduce((prev, now) => {
prev.push(now);
return arr2;
}, arr2);
// 或者
arr1 = arr1.reduceRight((prev, now) => {
prev.unshift(now);
return arr1;
}, arr1);
呃,可能凑合吧,勉强说的过去了!
- apply
arr1.push.apply( arr1, arr2 );
arr2.unshift.apply(arr2, arr1);
这个东西有点淫荡!
- 优化
// 针对巨型数组的优化
function combineInto(arr1, arr2) {
var len = arr1.length;
for (var i=0; i < len; i=i+5000) {
// 一次处理5000条
arr2.unshift.apply( arr2, arr1.slice( i, i+5000 ) );
}
}
完!