【问题标题】:Map over Javascript array and transform objects in it to a specific format?映射 Javascript 数组并将其中的对象转换为特定格式?
【发布时间】:2019-10-26 09:24:29
【问题描述】:

我有一个对象数组

const mainArray = [{
    name: 'main name',
    id: 'main id',
    parent: [{
      name: 'parent name',
      id: '1'
    }],
    child: [{
      name: 'child name',
      id: 'child id'
    }]
  }, {
    name: 'main name 2',
    id: 'main id 2',
    parent: [{
      name: 'parent name',
      id: '1'
    }],
    child: [{
      name: 'child name 2',
      id: 'child id 2'
    }]
  },
  {
    name: 'main name 3',
    id: 'main id 3',
    parent: [{
      name: 'parent name something else',
      id: '2'
    }],
    child: [{
      name: 'child name 3',
      id: 'child id 3'
    }]
  }
]

我需要把它带到这个表格

const resultArray = [{
  key: 'main',
  title: 'main name',
}, {
  key: 'parent',
  title: 'parent name'
}, {
  key: 'child',
  title: 'child name'
}]

到目前为止,我得到了这个

if (mainArray) {
   mainArray.map((main) => {
     if (main.child && main.child.length) {
       if (main.parent && main.parent.length) {
         main.parent.map((item) => {
           data.push({
             key: 'parent',
             title: item.name
           });
         });
       }

       data.push({
         key: 'main',
         title: main.name
       });

       main.child.map((item) => {
         data.push({
           key: 'child',
           title: item.name
         });
       });
     }
   });
 }

然后我用这个data array 来显示一个表格,它看起来像这样

我的问题是 - 两个mains 可以不同但具有相同的parent(父母有相同的ids)然后我不需要将父母两次添加到数组中,我需要它像这样显示

所以我正在寻找一种方法来判断两个 parents 对象是否具有相同的 id 以将它们合并在一起,以便在最终数组中只有一个 parent 和 main 和 @该父母的 987654337@ 被困在一个 parent 而不是两个相同的

这里是 link 到 jsfiddle

我可以使用 lodash

【问题讨论】:

  • 请从给定的数据中添加您想要的结果。
  • 这不是地图操作。您不会从内部函数返回任何内容,并且忽略结果。所以我认为使用地图功能没有意义。使用 forEach。它更适合您的其余代码。

标签: javascript lodash


【解决方案1】:

您可以首先按父对象分组并返回一个对象,其中每个键都是父名称,然后您可以从该对象创建一个数组。

const mainArray = [{"name":"main name","id":"main id","parent":[{"name":"parent name","id":"1"}],"child":[{"name":"child name","id":"child id"}]},{"name":"main name 2","id":"main id 2","parent":[{"name":"parent name","id":"1"}],"child":[{"name":"child name 2","id":"child id 2"}]},{"name":"main name 3","id":"main id 3","parent":[{"name":"parent name something else","id":"2"}],"child":[{"name":"child name 3","id":"child id 3"}]}]


function children(rest, child) {
  const result = [{
    key: 'main',
    title: rest.name
  }];
  result.push(...child.map(({
    name
  }) => ({
    key: 'child',
    title: name
  })))
  return result;
}

const groupByParent = mainArray.reduce((r, {
  parent,
  child,
  ...rest
}) => {
  parent.forEach(p => {
    if (!r[p.name]) {
      r[p.name] = [{
          key: 'parent',
          title: p.name
        },
        ...children(rest, child)
      ]
    } else {
      r[p.name].push(...children(rest, child));
    }
  })

  return r;
}, {})

const result = Object.values(groupByParent).flat()
console.log(result)

【讨论】:

  • 这帮助很大,谢谢。你能解释一下为什么我们在将child推送到resultresult.push(...child.map(({...时需要用户传播吗?
  • 因为 map 返回一个数组,而你想要推送每个对象而不是数组。
猜你喜欢
  • 1970-01-01
  • 2019-05-12
  • 2017-04-23
  • 1970-01-01
  • 2021-07-27
  • 2020-03-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多