首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在JavaScript中汇总对象和数组

如何在JavaScript中汇总对象和数组
EN

Stack Overflow用户
提问于 2021-09-22 01:58:56
回答 3查看 47关注 0票数 0

我正在尝试组合一个对象,其中涵盖了其中的一些信息。

代码语言:javascript
复制
const tests = [
    {
        id: 1,
        name: 'taro',
        designId: 1,
        designName: 'design1'
    },
    {
        id: 1,
        name: 'taro',
        designId: 2,
        designName: 'design2'
    },
    {
        id: 2,
        name: 'Bob',
        designId: 3,
        designName: 'design3'
    },
    {
        id: 2,
        name: 'Bob',
        designId: 4,
        designName: 'design4'
    },
];

我想设定以下期望。

代码语言:javascript
复制
result = [
  {
    id: 1,
    name: 'taro',
    designs: [
        { designId: 1, designName: 'design1' },
        { designId: 2, designName: 'design2' }
    ]
  },
  {
    id: 2,
    name: 'Bob',
    designs: [
        { designId: 3, designName: 'design3' },
        { designId: 4, designName: 'design4' }
    ]
  }
]

我试过使用lodash groupby作为我已经尝试过的东西,但我正在努力,因为我无法摆脱额外的属性。

代码语言:javascript
复制
const result = _.chain(tests)
    .groupBy('id')
    .map((value, key) => ({ id: key, designs: value }))
    .value();
EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2021-09-22 02:11:06

使用reducefindIndex

代码语言:javascript
复制
const tests = [
  {
    id: 1,
    name: 'taro',
    designId: 1,
    designName: 'design1'
  },
  {
    id: 1,
    name: 'taro',
    designId: 2,
    designName: 'design2'
  },
  {
    id: 2,
    name: 'Bob',
    designId: 3,
    designName: 'design3'
  },
  {
    id: 2,
    name: 'Bob',
    designId: 4,
    designName: 'design4'
  }
]

const arr = tests.reduce((acc, curr) => {
  const findIdx = acc.findIndex(x => x.name === curr.name)
  const design = { designId: curr.designId, designName: curr.designName }

  if (findIdx === -1) {
    acc.push({ id: curr.id, name: curr.name, designs: [design] })
  } else {
    acc[findIdx].designs.push(design)
  }

  return acc
}, [])

console.log(arr)

票数 0
EN

Stack Overflow用户

发布于 2021-09-22 02:06:09

您可以将Array.prototype.reduce()Object.values()结合使用

代码语言:javascript
复制
const tests = [{id: 1,name: 'taro',designId: 1,designName: 'design1',},{id: 1,name: 'taro',designId: 2,designName: 'design2',},{id: 2,name: 'Bob',designId: 3,designName: 'design3',},{id: 2,name: 'Bob',designId: 4,designName: 'design4'}]

const result = Object.values(tests.reduce((a, { id, name, ...rest }) => {
  a[id] = a[id] || { id, name, designs: [] }
  a[id].designs.push({ ...rest })
  return a
}, {}))

console.log(result)

票数 0
EN

Stack Overflow用户

发布于 2021-09-22 02:31:58

您可以使用Map轻松高效地实现此结果

代码语言:javascript
复制
const tests = [
  {
    id: 1,
    name: "taro",
    designId: 1,
    designName: "design1",
  },
  {
    id: 1,
    name: "taro",
    designId: 2,
    designName: "design2",
  },
  {
    id: 2,
    name: "Bob",
    designId: 3,
    designName: "design3",
  },
  {
    id: 2,
    name: "Bob",
    designId: 4,
    designName: "design4",
  },
];

const map = new Map();
tests.forEach(({ id, name, ...rest }) =>
  map.has(id)
    ? map.get(id).designs.push(rest)
    : map.set(id, { id, name, designs: [rest] })
);

const result = [...map.values()];

console.log(result);
代码语言:javascript
复制
/* This is not a part of answer. It is just to give the output fill height. So IGNORE IT */
.as-console-wrapper { max-height: 100% !important; top: 0; }

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/69277320

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档