跃然一笑
这里给出新的例子var arr1 = ['a'];var arr2 = ['b', 'c'];var arr3 = ['c', ['d'], 'e', undefined, null];代码段中修改部分前面以星号(*)标记出。基本执行:arr1.concat(arr2, arr3);返回:[ 'a', 'b', 'c', 'c', [ 'd' ], 'e', undefined, null ]考虑重复var concat = (function(){ // concat arr1 and arr2 without duplication.
var concat_ = function(arr1, arr2) { for (var i=arr2.length-1;i>=0;i--) {
arr1.indexOf(arr2[i]) === -1 ? arr1.push(arr2[i]) : 0;
}
}; // concat arbitrary arrays.
// Instead of alter supplied arrays, return a new one.
return function(arr) { var result = arr.slice(); for (var i=arguments.length-1;i>=1;i--) {
concat_(result, arguments[i]);
} return result;
};
}());执行:concat(arr1, arr2, arr3);返回:[ 'a', null, undefined, 'e', [ 'd' ], 'c', 'b' ]处理undefined和null这里的undefined可能由数组本身存在的undefined元素引起,也可能由于delete引起。var concat = (function(){ // concat arr1 and arr2 without duplication.
var concat_ = function(arr1, arr2) { for (var i=arr2.length-1;i>=0;i--) {
* if (arr2[i] === undefined || arr2[i] === null) {
* continue;
* }
arr1.indexOf(arr2[i]) === -1 ? arr1.push(arr2[i]) : 0;
}
}; // concat arbitrary arrays.
// Instead of alter supplied arrays, return a new one.
return function(arr) { var result = arr.slice(); for (var i=arguments.length-1;i>=1;i--) {
concat_(result, arguments[i]);
} return result;
};
}());执行:concat(arr1, arr2, arr3);返回:[ 'a', 'e', [ 'd' ], 'c', 'b' ]执行:delete arr3[2]; concat(arr1, arr2, arr3);返回:[ 'a', [ 'd' ], 'c', 'b' ]考虑数组var concat = (function(){
// concat arr1 and arr2 without duplication.
var concat_ = function(arr1, arr2) { for (var i=arr2.length-1;i>=0;i--) {* // escape undefined and null element
* if (arr2[i] === undefined || arr2[i] === null) {
* continue;
* }
* // recursive deal with array element
* // can also handle multi-level array wrapper* if (classof(arr2[i]) === 'Array') {
* for (var j=arr2[i].length-1;j>=0;j--) {* concat_(arr1, arr2[i][j]);
* }
* continue;
* }
arr1.indexOf(arr2[i]) === -1 ? arr1.push(arr2[i]) : 0;
}
};
// concat arbitrary arrays.
// Instead of alter supplied arrays, return a new one. return function(arr) {
var result = arr.slice(); for (var i=arguments.length-1;i>=1;i--) {
concat_(result, arguments[i]);
} return result;
};
}());执行:concat(arr1, arr2, arr3)返回:[ 'a', 'd', 'c', 'b' ]该代码也能够处理多层数组的解析。注意Native Javascript的concat操作并不改变原始数组,因此在上面提供的方案中,也不对原数组进行修改,而是返回新的数组。
桃花长相依
var merge = function() { return Array.prototype.concat.apply([], arguments)
}merge([1,2,4],[3,4],[5,6]);//[1, 2, 4, 3, 4, 5, 6]另外,最好加个去重处理,像上面的例子会处理重复元素。