在JavaScript中展平嵌套数组

Jes*_*ess 11 javascript arrays

我有一个可怕的数组看起来像这样:

编辑:

array = [
    {
        Letters: [{ Letter: 'A' }, { Letter: 'B' }, { Letter: 'C' }],
        Numbers: [{ Number: '1' }, { Number: '2' }, { Number: '3' }]
    },
    null,
    {
        Letters: [{ Letter: 'D' }, { Letter: 'E' }, { Letter: 'F' }, { Letter: 'G' }, { Letter: 'H' }],
        Numbers: [{ Number: '4' }, { Number: '5' }, { Number: '6' }, { Number: '7' }]
    }
];
Run Code Online (Sandbox Code Playgroud)

并希望数组看起来像这样:

flattenedArray = [a,b,c,1,2,3,d,e,f,g,h,4,5,6,7]
Run Code Online (Sandbox Code Playgroud)

不幸的是,我无法更改原始格式,因为这是合并我得到的两个API响应时收到的表单.

我尝试过使用:

var flattenedArray = [].concat.apply([], array);
Run Code Online (Sandbox Code Playgroud)

但它只是以输入的格式呈现数组.

我想知道是否有人有任何建议?

编辑:我已经尝试实施给出的建议 - 非常感谢你的帮助.这似乎是列表格式的一个问题 - 不幸的是使用chrome树形式的chrome控制台我无法看到数组输出的直接结构.

谢谢你的帮助!编辑2:请参阅上面的实际数组,感谢您向我展示如何看待这个!

Lua*_*ico 9

如果有lodash,你可以使用:

_.flattenDeep(array)
Run Code Online (Sandbox Code Playgroud)

如果您愿意,您还可以查看有关如何实现自己的ide 的源代码.


Nen*_*car 8

您可以使用forEach()返回新数组创建递归函数.

var array = [[['a','b','c'],[1,2,3]],[],[['d','e','f','g','h'],[4,5,6,7]]]
function flat(data) {
  var r = []
  data.forEach(e => Array.isArray(e) ? r = r.concat(flat(e)) : r.push(e));
  return r;
}

console.log(flat(array))
Run Code Online (Sandbox Code Playgroud)

您也可以使用reduce()而不是forEach()

var array = [[['a','b','c'],[1,2,3]],[],[['d','e','f','g','h'],[4,5,6,7]]]

function flat(data) {
  return data.reduce((r, e) => Array.isArray(e) ? r = r.concat(flat(e)) : r.push(e) && r, [])
}

console.log(flat(array))
Run Code Online (Sandbox Code Playgroud)

正如@Bergi建议你可以这样使用reduce().

data.reduce((r, e) => r.concat(Array.isArray(e) ? flat(e) : [e]), [])
Run Code Online (Sandbox Code Playgroud)


Nin*_*olz 8

编辑嵌套数组/对象的新请求和展平,您可以使用组合方法测试元素的类型.

var array = [{ Letters: [{ Letter: 'A' }, { Letter: 'B' }, { Letter: 'C' }], Numbers: [{ Number: '1' }, { Number: '2' }, { Number: '3' }] }, null, { Letters: [{ Letter: 'D' }, { Letter: 'E' }, { Letter: 'F' }, { Letter: 'G' }, { Letter: 'H' }], Numbers: [{ Number: '4' }, { Number: '5' }, { Number: '6' }, { Number: '7' }] }],
    result = array.reduce(function iter(r, a) {
        if (a === null) {
            return r;
        }
        if (Array.isArray(a)) {
            return a.reduce(iter, r);
        }
        if (typeof a === 'object') {
            return Object.keys(a).map(k => a[k]).reduce(iter, r);
        }
        return r.concat(a);
    }, []);

console.log(result);
Run Code Online (Sandbox Code Playgroud)
.as-console-wrapper { max-height: 100% !important; top: 0; }
Run Code Online (Sandbox Code Playgroud)

旧请求和不朽的问题如何平展嵌套数组.

var flat = (r, a) => Array.isArray(a) ? a.reduce(flat, r) : r.concat(a),
    inputArray = array = [[['a', 'b', 'c'], [1, 2, 3]], [], [['d', 'e', 'f', 'g', 'h'], [4, 5, 6, 7]]],
    outputArray = inputArray.reduce(flat, []);

console.log(outputArray);
Run Code Online (Sandbox Code Playgroud)

  • 只是测试了它,它有一个魅力 - 谢谢你花时间来帮助! (2认同)