首页 > 开发 > JS > 正文

javascript如何合并多个数组

2017-09-05 13:02:19  来源:网友分享

如题,已有两个数组

var array1 = ["a", "b"];var array2 = ["c", "d"];

我要合并后变成下面这样:

var array= ["a", "b", "c", "d"];

应该用什么方法呢?

解决方案

这里给出新的例子

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操作并不改变原始数组,因此在上面提供的方案中,也不对原数组进行修改,而是返回新的数组。
在github上创建了gist,欢迎修改指正。https://gist.github.com/4167036