16 July 2016
之前在UESTC前端群里跟一些朋友分享了一些javascript的思考题,旨在促进群内技术讨论,共同进步。期间不乏思维的火花,一直想将这些宝贵的财富沉淀下来,以便日后翻阅。
很久没有在群里出思考题了,前些天在工作中遇到一个问题,我将其抽象为一个思考题发布到群里。
将数组b在数组a的位置i后插入,并且打平。
对数组API熟悉的朋友,如果实现肯定不是难事,问题如何让我们的代码更加优雅呢?
我把题目发布到群里时,我心里已经有一个答案了,不过看到大家给出的答案还是让我茅塞顿开,醍醐灌顶。
基本思路是围绕打平参数调用splice,切分原数组然后进行数组拼接展开的。以下为大家逐一展示人民群众的伟大智慧。
方案一 通过函数的apply方法调用仅支持变长参数的splice方法
var insertArray = function(target, i, source) {
target.splice.apply(target, [i, 0].concat(source));
return target;
};
方案二 通过slice方法切分元素组,在将三段数组通过concat进行拼接
var insertArray = function(target, i, source) } {
return target.slice(0, i).concat(source, target.slice(i));
};
接下来的两个解答,要感谢伟大ES6提供了spread运算符。
方案三 通过spread运算符将数组展开调用slice方法
var insertArray = function(target, i, source) {
target.splice(i, 0, ...source);
return target;
};
方案四 通过spread运算符结合slice方法生成数组字面量
var insertArray = function(target, i, source) {
return [...target.slice(0, i), ...source, ...target.slice(i)];
};
方案三为方案一的ES6升级版,方案四为方案二的ES6升级版,我在工程实践中采用了字符数最少的方案三。
以上各个方案均出自群里的@南柯一梦,灵活多变的思路,对API的娴熟应用,都让我们受益匪浅,在此特别鸣谢。