我正在尝试使用随机嵌套数组来压缩数组。我不确定为什么我写的函数会以无限循环结束:
let array = [1, 2, [3]]
var final_array = []
function flattener(array){
for(i = 0; i < array.length; i++){
if(array[i] instanceof Array){
flattener(array[i])
}else{
final_array.push(array[i])
}
}
}
flattener(array)
我认为应该发生的是:
当我在[3]
的for循环检查中时,它进入if语句,再次调用flattener
,它结算,然后退出if语句。
相反,if语句一直调用无限地检查[3]
,我不确定为什么会这样。
答案 0 :(得分:8)
问题是您没有声明i
变量,因此它会泄漏到全局空间并在递归时被重置。
变化:
for(i = 0; i < array.length; i++){
要:
for(var i = 0; i < array.length; i++){
答案 1 :(得分:2)
这是另一种使用Array.reduce和Array.concat的方法。
/**
* Flattens an array of arrays into one-dimensional array
* @param {Array} arr: the array to be flattened
* @return {Array}
*/
function flatten(arr) {
return arr.reduce(function (flattened, cvalue) {
return flattened.concat(Array.isArray(cvalue) ? flatten(cvalue) : cvalue);
}, []); // initial value of flattened array []
}
测试它......
let array = [1, 2, [3]]
var falttened = flatten(array)
看看他的要点:Array flatten
答案 2 :(得分:2)
Array#concat
加Array#map
另一种方式你可以实现这个
var flattener = arr => [].concat.apply([], arr.map(item=>Array.isArray(item) ? flattener(item) : item));
或ES5版本
var flattener = function flattener(arr) {
return [].concat.apply([], arr.map(function (item) {
return Array.isArray(item) ? flattener(item) : item;
}));
};
答案 3 :(得分:1)
更改
for(i = 0; i < array.length; i++)
到
for(var i = 0; i < array.length; i++)