【问题标题】:How to push id of parent object to child objects?如何将父对象的 id 推送到子对象?
【发布时间】:2021-03-18 06:36:14
【问题描述】:

我有一个对象数组,它有一个内部对象数组,我想将父对象的 id 推送到每个子对象。

   a = [
        {id: 'abc', stage: [{name: 'car' , value: '123'},{name: 'bus' , value: '345'},{name: 'truck' , value: '567'}],
        {id: 'def', stage: [{name: 'bike' , value: '890'},{name: 'cycle' , value: '123'},{name: 'car' , value: '456'}]}
    ]

expected output = [
    {name: 'car' , value: '123', id: 'abc'},{name: 'bus' , value: '345', 'abc'},{name: 'truck' , value: '567', 'abc'}, {name: 'bike' , value: '890', id: 'def'},{name: 'cycle' , value: '123',id: 'def',id: 'def'},{name: 'car' , value: '456', id: 'def'}
]

我能够获得唯一的舞台,但无法将 id 推送到每个对象。请帮忙

const getAllStages = [].concat(...map(a, el => el.stage));
console.log(getAllStages )

【问题讨论】:

  • 什么是map()
  • 它的 lodash 地图.. import { map } from 'lodash';对于角度
  • 为什么要连接到一个空数组?删掉这一步:[ ...map(...) ],甚至只是 map(...) 本身,它无论如何都会返回一个数组,这就是你想要的。
  • 如果你使用 Lodash,那就更简单了:_.map(a, 'stage')。完成。
  • 好的....但我希望将 id 添加到每个对象。现在我只得到阶段

标签: javascript angularjs lodash


【解决方案1】:

再次使用.map()el.id 添加到el.stage 的每个元素中。

您可以在外部映射中使用.flatMap() 将所有结果连接到一个数组中。

const a = [
    {id: 'abc', stage: [{name: 'car' , value: '123'},{name: 'bus' , value: '345'},{name: 'truck' , value: '567'}]},
    {id: 'def', stage: [{name: 'bike' , value: '890'},{name: 'cycle' , value: '123'},{name: 'car' , value: '456'}]}
]

result = a.flatMap(({
  id,
  stage
}) => stage.map(s => ({
  id: id,
  ...s
})));

console.log(result);

【讨论】:

  • 括号繁重到与 LISP 接壤的地步,但解构非常简洁!
【解决方案2】:

如果您尝试合并id

let remapped = a.map(e => ({ id: a.id, ...e }));

其中将每个条目转换为继承 a.id 值的对象并添加对象中的任何其他内容。

【讨论】:

    【解决方案3】:

    这是一个例子和结果:)

    a.forEach(function(row) {
        row.stage.map(function (child) {child.id = row.id})
    })
    

    结果:

    [{"id":"abc","stage":[{"name":"car","value":"123","id":"abc"},{"name":"bus","value":"345","id":"abc"},{"name":"truck","value":"567","id":"abc"}]},{"id":"def","stage":[{"name":"bike","value":"890","id":"def"},{"name":"cycle","value":"123","id":"def"},{"name":"car","value":"456","id":"def"}]}]
    

    【讨论】:

    • forEach map? map 结果在此代码中被丢弃。您还永久地将id 干扰到每个元素中。
    • @tadman 实际上 vishnu 需要完全一样,这就是我以这种方式使用的原因
    【解决方案4】:

    不用库也可以这样写

    let a = [
        {
            id: 'abc', stage:
                [
                    { name: 'car', value: '123' },
                    { name: 'bus', value: '345' },
                    { name: 'truck', value: '567' }
                ]
        },
        {
            id: 'def', stage:
                [
                    { name: 'bike', value: '890' },
                    { name: 'cycle', value: '123' },
                    { name: 'car', value: '456' }
                ]
        }
    ]    
    let output = [];
        for (const element of a) {
            for (const stageElement of element.stage) {
                let newElement = {
                    name: stageElement.name,
                    value: stageElement.value,
                    id: element.id
                };
                output.push(newElement);
            }
        }
    

    【讨论】:

    • map... 更容易
    【解决方案5】:
    const a = [
        {id: 'abc', stage: [{name: 'car' , value: '123'},{name: 'bus' , value: '345'},{name: 'truck' , value: '567'}]},
        {id: 'def', stage: [{name: 'bike' , value: '890'},{name: 'cycle' , value: '123'},{name: 'car' , value: '456'}]}
    ]
    
    a.forEach(item => {
        const itemId = item.id;
        const stages = item.stage;
    
        stages.forEach(stage => {
            stage['id'] = itemId;
        })
    });
    
    console.log(a);
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-11-12
      • 1970-01-01
      • 2017-08-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多