扁平化数组 JavaScript 的对象数组



我正在尝试扁平化数组的对象数组。例如,我们可能有这样的内容:

[{ numbers: [1, 2, 3] }, { numbers: [4, 5] }, { numbers: [6] }]

我想把它扁平化成:

[1, 2, 3, 4, 5, 6]

我有一个可行的解决方案,做这样的事情:

const arr = [{ numbers: [1, 2, 3] }, { numbers: [4, 5] }, { numbers: [6] }];
const almostFlattened = arr.map((obj) => obj.numbers);
const flattened = [].concat.apply([], almostFlattened);
console.log(flattened);

有谁知道这里有一个更简单或更高性能的解决方案,最好没有almostFlattened中间步骤?

您可以尝试Array.reduce(),并通过将数字与累加器连接起来来展平数字的数组:

const arr = [{ numbers: [1, 2, 3] }, { numbers: [4, 5] }, { numbers: [6] }];
const result = arr.reduce((r, obj) => r.concat(obj.numbers), []);
console.log(result);

另一个选项是Array.flatMap()(IE/Edge 不支持(:

const arr = [{ numbers: [1, 2, 3] }, { numbers: [4, 5] }, { numbers: [6] }];
const result = arr.flatMap(obj => obj.numbers);
console.log(result);

为什么不只使用您拥有的东西,而是内联?无需声明中间变量almostFlattened何时可以将.map调用作为参数的一部分放入.concat

const arr = [{ numbers: [1, 2, 3] }, { numbers: [4, 5] }, { numbers: [6] }]
const result = [].concat(...arr.map(o => o.numbers));
console.log(result)

将 spread 语法与 reduce 一起使用:

const input = [{ numbers: [1, 2, 3] }, { numbers: [4, 5] }, { numbers: [6] }]
const output = input.reduce(((outputSoFar, { numbers }) => [...outputSoFar, ...numbers]), []);
console.log(output);

FlatMap 很棒

const data = [{ numbers: [1, 2, 3] }, { numbers: [4, 5] }, { numbers: [6] }]
data.flatMap(n => n.numbers)

如果要使用数组平展对象:

Object.values({one: [1,2,3], two: [4,5,6]}).flat()

我还想我会把它扔在那里,以防有人使用像 lodash/underscore 这样的东西(在我发布问题时不知道这个函数的存在(:

const arr = [{ numbers: [1, 2, 3] }, { numbers: [4, 5] }, { numbers: [6] }];
const flattened = _.flatten(arr, 'numbers');
console.log(flattened);
<script src="https://cdn.jsdelivr.net/npm/lodash@2.4.2/lodash.js"></script>

对于更深入嵌套的数组数组,例如: [1, 2, 3, [4, [5, [6, [7]]]]]

const flatten = (input, acc=[]) => {
    return input.reduce((_, current) => {
        if (Array.isArray(current)) return flatten(current, acc);  
        acc.push(current);
        return acc;
    }, []);
}

用法:

console.log(flatten([1, 2, 3, [4, [5, [6, [7]]]]]));

最新更新