一:二維陣列
1、遍歷降維
arr = [1,2,[2,3]];
var result = [];
for(var i = 0;i<arr.length;i++){
for(var j=0;j<arr[i].length;j++){
result.push(arr[i][j]);
}
}
console.log(result);
複製程式碼
2、使用concat
arr的每一個元素都是一個陣列或引數,作為concat方法的引數,陣列中的引數或每一個子元素又都會被獨立插入進新陣列。
arr = [1,2,[3,4]]
var result = [];
for(var i =0;i<arr.length;i++){
result = result.concat(arr[i]);
}
console.log(result);
複製程式碼
3、使用apply+concat
apply方法會呼叫一個函式,apply方法的第一個引數會作為被呼叫函式的this值,apply方法的第二個引數(一個陣列,或類陣列的物件)會作為被呼叫物件的arguments值,也就是說該陣列的各個元素將會依次成為被呼叫函式的各個引數。
arr = [1,2,3,[2,6]];
var result = Array.prototype.concat.apply([],arr);
console.log(result);
複製程式碼
二:多維陣列
1、先把陣列轉化為字串,之後在把字串轉化為陣列
a: join() 方法用於把陣列中的所有元素放入一個字串,split() 方法用於把一個字串分割成字串陣列.
arr = [1,2,[1,5,[4,7]]];
arr = arr.join(',').split(',');
複製程式碼
b: toString() 方法可把一個邏輯值轉換為字串,並返回結果。
arr = [1,2,[1,5,[4,7]]];
arr = arr.toString().split(',');
複製程式碼
c:空字串
arr = [1,2,[1,5,[4,7]]];
arr = (arr+'').split(',');
複製程式碼
2、使用陣列map()方法,對陣列中的每一項執行給定函式,返回每次函式呼叫的結果組成的陣列
arr = [1,2,[1,5,[4,7]]];
arr = (arr+'').split(',');
var arr2 = arr.map(function(x){
return Number(x);
});
複製程式碼
3、遞迴
arr = [1,2,[1,5,[4,7]]];
function isArr(arr){
var result = [];
for(var i=0;i<arr.length;i++){
if(Array.isArray(arr[i])){
isArr(arr[i]);
}else{
result.push(arr[i]);
}
}
return result;
}
isArr(arr);複製程式碼
4、reduce+遞迴
arr = [1,2,[1,5,[4,7]]];
const fatten= arr => arr.reduce(
(arrs,val) => arrs.concat(Array.isArray(val) ? fatten(val) : val),[]
);
複製程式碼
5、棧方法
通過棧方法,建立了一個棧,將陣列的內容存進去,然後逐個取出來,如果取出來的是個陣列,就將這個陣列打散拼接進棧中,在出棧一個,這樣迴圈。
Array.prototype.deepFlatten = function() {
var result = []; //定義儲存結果的陣列
var stack = this; //將陣列放入棧中
while (stack.length !== 0) { //如果棧不為空,則迴圈遍歷
var val = stack.pop(); //取出最後一個值
if (Array.isArray(val)) { //判斷是不是陣列
stack = stack.concat(val); //如果是陣列就將拼接入棧中
} else {
result.unshift(val); //如果不是陣列就將其取出來放入結果陣列中
}
}
return result;
}
var arr = [2, 3, [2, 2],
[3, 'f', ['w', 3]], { "name": 'Tom' }
];
console.log(arr.deepFlatten()); //=>[ 2, 3, 2, 2, 3, 'f', 'w', 3, { name: 'Tom' } ]
複製程式碼
unshift() 方法可向陣列的開頭新增一個或更多元素,並返回新的長度。unshift() 方法不建立新的建立,而是直接修改原有的陣列。