我得到的问题是;
给出一个或多个嵌套数组,返回一个新的平面数组,其中所有嵌套数组的所有元素均按其原始顺序
我想出的答案是;
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]]);
});
});
我不知道还有什么办法尝试解决这个问题,有人建议吗?
答案 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));