JS演算法——陣列降維

Jsp發表於2018-05-29

一:二維陣列

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() 方法不建立新的建立,而是直接修改原有的陣列。


相關文章