JS如何展平嵌套数组

时间:2018-12-19 17:24:27

标签: javascript arrays nested

我得到的问题是;

给出一个或多个嵌套数组,返回一个新的平面数组,其中所有嵌套数组的所有元素均按其原始顺序

我想出的答案是;

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 :(得分:1)

您需要通过移交数组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; }

答案 1 :(得分:1)

也许不是最优雅的解决方案,但这将使任何数量的嵌套数组变平坦。这是一个递归函数,可修改新数组作为副作用:

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);

答案 2 :(得分:1)

您可以使用reduce plus spread操作符。刚刚针对特定问题对此进行了编码,但似乎可以正常工作。它使用递归并适用于多个嵌套数组。

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));