首页 > 解决方案 > 使用具有嵌套对象的对象展平数组

问题描述

许多类似于这里这里的问题,但由于答案中的代码非常简洁,我很难根据自己的需要进行修改。

我有一个包含如下对象的数组:

[
    {
        id: 1,
        someProp: "value of some prop",
        metaData: {
            metaId: 123
            uuid: "2348_4354_dfgg_r343"
        }
    },
    {
        id: 2,
        someProp: "value of some prop again",
        metaData: {
            metaId: 321
            uuid: "9897_3543_ergl_j435"
        }
    }
]

我需要这个看起来像:

[
    {
        id: 1,
        someProp: "value of some prop",
        metaId: 123
        uuid: "2348_4354_dfgg_r343"
    },
    {
        id: 2,
        someProp: "value of some prop again",
        metaId: 321
        uuid: "9897_3543_ergl_j435"
    }
]

所以嵌套metaData对象的属性必须成为数组中每个项目的父对象的一部分。到目前为止,我已经尝试过:

console.log(Object.assign(
    {}, 
    ...function _flatten(o) { 
        return [].concat(...Object.keys(o)
            .map(k => 
                typeof o[k] === 'object' ?
                    _flatten(o[k]) : 
                    ({[k]: o[k]})
            )
        );
    }(events)
));

但是,这只给了我扁平对象,但我的数组目前有两个。

标签: javascriptarraystypescriptjavascript-objects

解决方案


您可以传播嵌套的对象。

const
    data = [{ id: 1, someProp: "value of some prop", metaData: { metaId: 123, uuid: "2348_4354_dfgg_r343" } }, { id: 2, someProp: "value of some prop again", metaData: { metaId: 321, uuid: "9897_3543_ergl_j435" } }],
    result = data.map(({ metaData, ...o }) => ({ ...o, ...metaData }));        

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


推荐阅读