原理參考 優(yōu)雅的數(shù)組降維——Javascript中apply方法的妙用蝶桶。我的博客 if-true.com。
現(xiàn)將幾種思路由淺入深地依次整理出來(lái)掉冶,并從二維上升到多維數(shù)組真竖。
1. 嵌套循環(huán)
對(duì)于二維數(shù)組來(lái)說(shuō)很容易想到,但對(duì)于多維以及不定維度的情況厌小,嵌套的層數(shù)是不一定的恢共,復(fù)雜度也會(huì)大大增加。以二維數(shù)組為例璧亚。
function reduceDimension(arr) {
var result = [];
for(var i = 0; i < arr.length; i++) {
for(var j = 0; j < arr[i].length; j++) {
result.push(arr[i][j]);
}
}
return result;
}
2. 利用 concat
轉(zhuǎn)換
如果 concat 方法的參數(shù)是一個(gè)元素讨韭,該元素會(huì)被直接插入到新數(shù)組中;如果參數(shù)是一個(gè)數(shù)組癣蟋,該數(shù)組的各個(gè)元素將被插入到新數(shù)組中透硝。同樣以二維數(shù)組為例。
function reduceDimension(arr) {
var result = [];
for(var i = 0; i < arr.length; i++) {
result = result.concat(arr[i]);
}
return result;
}
看似從兩重循環(huán)減為一個(gè)循環(huán)疯搅,少了一半濒生,仔細(xì)發(fā)現(xiàn)其實(shí)只是達(dá)到了降一維的作用。當(dāng)維度上升時(shí)幔欧,并不好使罪治。
3. 利用 apply 和 concat 轉(zhuǎn)換
apply方法的第一個(gè)參數(shù)會(huì)作為被調(diào)用函數(shù)的this值丽声,apply方法的第二個(gè)參數(shù)(一個(gè)數(shù)組,或類數(shù)組的對(duì)象)會(huì)作為被調(diào)用對(duì)象的arguments值觉义,也就是說(shuō)該數(shù)組的各個(gè)元素將會(huì)依次成為被調(diào)用函數(shù)的各個(gè)參數(shù)雁社。同樣以二維數(shù)組為例。
function reduceDimension(arr) {
return Array.prototype.concat.apply([], arr);
}
這里甚至沒(méi)有用到循環(huán)晒骇。
4. 多維情況
這里考慮維度不一定的情況霉撵,需要通過(guò) instanceof
來(lái)判斷數(shù)組的各個(gè)元素是否還是數(shù)組。于是有了下面的解決方案厉碟。
function reduceDimension(arr) {
var tmp = arr;
var result = arr;
while(tmp instanceof Array) {
result = Array.prototype.concat.apply([], result);
tmp = tmp[0];
}
return result;
}
暫時(shí)想到這么多了喊巍。