【问题标题】:Combine Objects and place into array - JavaScript / React合并对象并放入数组 - JavaScript / React
【发布时间】:2019-04-27 15:28:57
【问题描述】:

我在一个数组中有多个对象。他们每个人都有一个分配给他们的 labelId。如果标签 id 相同,那么我需要通过将一些值放在新组合对象的数组中来组合对象。

[
    {
        field: "legalName",
        isOpened: false,
        label: "Legal Name",
        labelId: 1,
        value: "John Doe"
    },
    {
        field: "homeAddress1",
        isOpened: false,
        label: "Home Address",
        labelId: 2,
        value: "2343 Main Street"
    },
    {
        field: "homeAddress2",
        isOpened: false,
        label: "Home Address",
        labelId: 2,
        value: "New York, NY"
    }
]

我希望它看起来像什么

[
    {
        isOpened: false,
        label: "Legal Name",
        labelId: 1,
        values:
            [
                {field: "legalName", value: "John Doe"}
            ]
    },
    {
        isOpened: false,
        label: "Home Address",
        labelId: 2,
        values:
            [
                {field: "homeAddress1", value: "2343 Main Street"},
                {field: "homeAddress2", value: "New York, NY"}
            ]
    }
]

我正在从原始对象中删除字段和值,并将其放入所有对象的值数组中,无论它们是否具有相同的 labelId。

到目前为止的代码 -

personalInfoArray.forEach(info => {
    personalInfoArray.forEach(info2 => {
        if ((info.labelId === info2.labelId) && (info.field !== info2.field)) {
            info.values = [
                {field: info.field, value: info.value},
                {field: info2.field, value: info2.value}
            ]

        }
    })
})

我在同一个数组中循环两次以确定对象是否具有相同的 labelId,如果成功 - 创建数组。问题是我没有删除属性,而另一个对象仍然存在。如果它们没有相同的 labelId,则不会发生任何事情。

谢谢

【问题讨论】:

  • 为什么 legalName 值是一个数组?一个人只有一个法定姓名……不是吗?
  • 主要是为了与其他一切保持一致。上面的例子只是整体数据的一小部分。
  • 似乎将所有字段组合成一个对象比对象数组更有意义......只是我的意见
  • 别担心!感谢反馈!你的理由是什么?
  • 为什么?当全部在一个对象中时,无需弄清楚什么属性在哪里。主对象的属性当然可以包含数组

标签: javascript arrays reactjs ecmascript-6


【解决方案1】:

这是一种使用函数Array.prototype.reduce将对象按labelId分组并使用函数Object.values提取分组对象的方法。

let arr = [{    field: "legalName",    isOpened: false,    label: "Legal Name",    labelId: 1,    value: "John Doe"  },  {    field: "homeAddress1",    isOpened: false,    label: "Home Address",    labelId: 2,    value: "2343 Main Street"  },  {    field: "homeAddress2",    isOpened: false,    label: "Home Address",    labelId: 2,    value: "New York, NY"  }],
    result = Object.values(arr.reduce((a, {labelId, field, isOpened, label, value}) => {
      (a[labelId] || (a[labelId] = {isOpened, label, labelId, values: []})).values.push({field, value});
      return a;
    }, Object.create(null)));

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-12-02
    • 1970-01-01
    • 2019-02-19
    • 2023-04-07
    • 1970-01-01
    • 2014-09-22
    相关资源
    最近更新 更多