JS как сплющить вложенный массив - PullRequest
0 голосов
/ 19 декабря 2018

Мне был задан вопрос:

При наличии вложенного массива или массивов вернуть новый плоский массив со всеми элементами всех вложенных массивов в их первоначальном порядке

я пришел к ответу:

function flattenArray (arrayOfArrays) {  
arrays = arrays.reduce(function(a, b){
    return a.concat(b);
}, []);

console.log(merged);

Мой ответ проверяется на это;

describe("flattenArray", () => {
it("returns a flat array with all the elements of the nested arrays in      their original order", () => {
  let arrayOfArrays, expected;
  arrayOfArrays = [[1, 2], [], [3], ["hello", true]];
  expected = [1, 2, 3, "hello", true];
  expect(flattenArray(arrayOfArrays)).to.eql(expected);

  arrayOfArrays = [[1], [2], [[3, 4]]];
  expected = [1, 2, [3, 4]];
  expect(flattenArray(arrayOfArrays)).to.eql(expected);
});
it("does not mutate the passed array, i.e. returns a new array, leaving the original untouched", () => {
  const original = [[1, 2], [], [3, 4]];
  const flat = flattenArray(original);
  expect(original).to.not.equal(flat);
  expect(original).to.eql([[1, 2], [], [3, 4]]);
});
});

Понятия не имею, как еще попытаться решить этот вопрос, кто-нибудьесть предложения.

Ответы [ 3 ]

0 голосов
/ 19 декабря 2018

Возможно, не самое элегантное решение, но это сгладит любое количество вложенных массивов.Это рекурсивная функция, которая изменяет новый массив как побочный эффект:

var arrOfArrs = [[1, 2, 3], [4, 5, 6], 7, [8, [9, 10, 11, 12]]];
newArr = [];
function flattenArray(arr) {
    for(var i=0; i < arr.length; i++) {
        typeof arr[i] == 'object' ? flattenArray(arr[i]) : newArr.push(arr[i]);   
    }
}

flattenArray(arrOfArrs);
console.log(newArr);
0 голосов
/ 19 декабря 2018

Вы можете использовать оператор «уменьшить плюс спред».Просто закодировал это для конкретного вопроса, но, кажется, работает хорошо.Он использует рекурсию и работает для нескольких вложенных массивов.

function flatArray(a){
  return a.reduce( (accumulator, current) => {
    if (!Array.isArray(current)) return [...accumulator, current];
    return flatArray([...accumulator, ...current]);
  }, []);
}

let a = [ 1, [2], [3,4], [], [5], [6, [7]], [[[8]]] ];

console.log(flatArray(a));
0 голосов
/ 19 декабря 2018

Вам нужно вернуть уменьшенный массив, взяв переданный массив arrayOfArrays.

function flattenArray(arrayOfArrays) {  
    return arrayOfArrays.reduce(function(a, b) {
        return a.concat(b);
    }, []);
}

Для нескольких вложенных массивов необходимо проверить массив и использовать рекурсию функции.

function deepFlattenArray(arrayOfArrays) {
    return arrayOfArrays.reduce(function(a, b) {
        return a.concat(Array.isArray(b) ? deepFlattenArray(b) : b);
    }, []);
}

function flattenArray(arrayOfArrays) {
    return arrayOfArrays.reduce(function(a, b) {
        return a.concat(b);
    }, []);
}

console.log(deepFlattenArray([[[1, 2], [3, [4, 5], 6], 7], 8]));
console.log(flattenArray([[[1, 2], [3, [4, 5], 6], 7], 8]));
.as-console-wrapper { max-height: 100% !important; top: 0; }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...