Как я могу рекурсивно преобразовать вложенный массив в плоский массив? - PullRequest
8 голосов
/ 08 марта 2019

Я пытаюсь получить этот вложенный массив в плоский массив.При использовании этого способа решения кажется, что каждый раз, когда я вызываю функцию 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 ]

2 голосов
/ 08 марта 2019

В настоящее время ваша функция не сглаживает массив, а просто анализирует каждый отдельный элемент массива.Он по-прежнему возвращает ту же структуру массива.

Чтобы сгладить массив, вы должны также передать результирующий массив, чтобы отдельный элемент можно было вставить прямо в результирующий массив вместо создания другого массива и отправить его врезультирующий массив (который производит ту же исходную структуру массива)

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 голос
/ 08 марта 2019

flat выполняет работу с уровнем depth param, определяющим, насколько глубоко должна быть сглажена структура вложенного массива.

Пример

const arr = ['I', 'am', 'working', ['on', 'another', 'level'], 'now', ["now", ["hello", "you you"]]]

console.log(arr.flat(2))
1 голос
/ 08 марта 2019

Ваш код и теория в порядке.Вы просто выбрали неправильный метод.Используйте 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']]));
1 голос
/ 08 марта 2019

Вы можете использовать flatMap

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

console.log(newArr);

или используйте квартира

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]
0 голосов
/ 02 июля 2019

Вот три решения

Вы можете использовать .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))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...