如何将嵌套数组递归转换为平面数组?

时间:2019-03-08 04:13:07

标签: javascript arrays recursion nested

我正在尝试将此嵌套数组转换为平面数组。在使用这种方法解决问题时,似乎每次我回调arrayFlattener(element)时,newArr都会变成一个空数组。有人可以帮我弄这个吗?谢谢。

const arrayFlattener = (arr) => {
    let newArr = [];
    
    for (let i = 0; i < arr.length; i++) {
        let element = arr[i];
        if (Array.isArray(element)){
            newArr.push(arrayFlattener(element));
            
        } else {
            newArr.push(element);
        }
    }
    return newArr;
}
console.log(arrayFlattener(['I', 'am', 'working', ['on', 'another', 'level']]));

5 个答案:

答案 0 :(得分:2)

当前,您的函数并未使数组变平,而只是对数组的每个元素进行了解析。它仍然返回相同的数组结构。

要展平数组,还应该传递结果数组,以便可以将单个元素直接推入结果数组,而不是制作另一个数组并将其推入结果数组(这将产生相同的初始数组结构) )

let newArr = [];
const arrayFlattener = (arr, result) => {
    for (let i = 0; i < arr.length; i++) {
        let element = arr[i];
        if (Array.isArray(element)){
            result = arrayFlattener(element, result);
            
        } else {
            result.push(element);
        }
    }
    return result
}
console.log(arrayFlattener(['I', 'am', 'working', ['on', 'another', 'level'], 'now'], newArr));

答案 1 :(得分:1)

您可以使用flatMap

let newArr = ['I', 'am', 'working', ['on', 'another', 'level']].flatMap(el=>el);

console.log(newArr);

或使用flat

var arr1 = [1, 2, [3, 4]];
arr1.flat(); 
// [1, 2, 3, 4]

var arr2 = [1, 2, [3, 4, [5, 6]]];
arr2.flat();
// [1, 2, 3, 4, [5, 6]]

var arr3 = [1, 2, [3, 4, [5, 6]]];
arr3.flat(2); // depth argument to flatten the array
// [1, 2, 3, 4, 5, 6]

答案 2 :(得分:1)

您的代码和理论很好。您只是选择了错误的方法。使用concat代替push(以扩展结果而不是插入结果):

const arrayFlattener = (arr) => {
    let newArr = [];
    
    for (let i = 0; i < arr.length; i++) {
        let element = arr[i];
        if (Array.isArray(element)){
            newArr = newArr.concat(arrayFlattener(element));
            
        } else {
            newArr.push(element);
        }
    }
    return newArr;
}
console.log(arrayFlattener(['I', 'am', 'working', ['on', 'another', 'level']]));

答案 3 :(得分:1)

import cx_Oracle import datetime conn = cx_Oracle.connect("pythondemo/welcome") cursor = conn.cursor() numVar = cursor.var(int) strVar = cursor.var(str) dateVar = cursor.var(datetime.datetime) boolVar = cursor.var(bool) numVar.setvalue(0, 6) strVar.setvalue(0, "Test String") dateVar.setvalue(0, datetime.datetime(2016, 5, 28)) boolVar.setvalue(0, False) # show the original values print("NUMBERVALUE ->", numVar.getvalue()) print("STRINGVALUE ->", strVar.getvalue()) print("DATEVALUE ->", dateVar.getvalue()) print("BOOLEANVALUE ->", boolVar.getvalue()) print() cursor.execute(""" declare t_Record pkg_Demo.udt_DemoRecord; begin t_Record.NumberValue := :numVar; t_Record.StringValue := :strVar; t_Record.DateValue := :dateVar; t_Record.BooleanValue := :boolVar; pkg_Demo.DemoRecordsInOut(t_Record); :numVar := t_Record.NumberValue; :strVar := t_Record.StringValue; :dateVar := t_Record.DateValue; :boolVar := t_Record.BooleanValue; end;""", numVar = numVar, strVar = strVar, dateVar = dateVar, boolVar = boolVar) # show the modified values print("NUMBERVALUE ->", numVar.getvalue()) print("STRINGVALUE ->", strVar.getvalue()) print("DATEVALUE ->", dateVar.getvalue()) print("BOOLEANVALUE ->", boolVar.getvalue()) print() flat depth级来完成这项工作,指定嵌套数组结构应展平的深度。

示例

param

答案 4 :(得分:0)

这是三种解决方案

您可以使用.flatMap并进行递归或

const flatten = (xs) =>
  Array.isArray(xs) ? xs.flatMap(flatten) : [xs]

const array = ['I', 'am', 'working', ['on', 'another', ['level']]]

console.log(flatten(array))

您可以使用.reduce和递归

const flatten = (xs) =>
  xs.reduce(
    (y, x) => y.concat(Array.isArray(x) ? flatten(x) : [x]),
    [])

const array = ['I', 'am', 'working', ['on', 'another', ['level']]]

console.log(flatten(array))

甚至更好的是使用.flat

const flatten = (xs) =>
  xs.flat(Infinity)

const array = ['I', 'am', 'working', ['on', 'another', ['level']]]

console.log(flatten(array))