我有一个嵌套对象的动态数组,如下所示:

[
    {
        "fields": [
            {
                "field-1": {
                    "id": "field-1",
                    "value": "a1"
                },
                "field-2": {
                    "id": "field-2",
                    "value": "a2"
                },
                "field-3": {
                    "id": "field-3",
                    "value": "a3"
                }
            }
        ]
    },
    {
        "fields": [
            {
                "field-1": {
                    "id": "field-1",
                    "value": "b1"
                },
                "field-2": {
                    "id": "field-2",
                    "value": "b2"
                },
                "field-3": {
                    "id": "field-3",
                    "value": "b3"
                }
            }
        ]
    }
]

我想要将此数组解析/简化为以下类型的 struct :

[
    {
        "field-1": "a1",
        "field-2": "a2",
        "field-3": "a3"
    },
    {
        "field-1": "b1",
        "field-2": "b2",
        "field-3": "b3"
    },
]

虽然我已经有了一种迭代数组并构造新数组的详细方法,但我想知道是否可以使用Reduced方法获得 struct ,因为那样会更快?

推荐答案

以下是我的版本:

const res = data
  .flatMap((obj) => obj.fields)
  .map((obj) =>
    Object.entries(obj).reduce((p, [k, v]) => ({ ...p,
      [k]: v.value
    }), {})
  );

console.log(JSON.stringify(res, null, 4));
<script>
  const data = [{
      "fields": [{
        "field-1": {
          "id": "field-1",
          "value": "a1"
        },
        "field-2": {
          "id": "field-2",
          "value": "a2"
        },
        "field-3": {
          "id": "field-3",
          "value": "a3"
        }
      }]
    },
    {
      "fields": [{
        "field-1": {
          "id": "field-1",
          "value": "b1"
        },
        "field-2": {
          "id": "field-2",
          "value": "b2"
        },
        "field-3": {
          "id": "field-3",
          "value": "b3"
        }
      }]
    }
  ]
</script>

解释

我们首先对给定的数组进行flatMap(),因为我们在数组中有数组,以获得以下结果:

const x = data.flatMap((obj) => obj.fields);

输出:

[
    {
        "field-1": {
            "id": "field-1",
            "value": "a1"
        },
        "field-2": {
            "id": "field-2",
            "value": "a2"
        },
        "field-3": {
            "id": "field-3",
            "value": "a3"
        }
    },
    {
        "field-1": {
            "id": "field-1",
            "value": "b1"
        },
        "field-2": {
            "id": "field-2",
            "value": "b2"
        },
        "field-3": {
            "id": "field-3",
            "value": "b3"
        }
    }
]

现在,对于上面数组中的每个对象,我只需要更改每个对象中每个键的值.因此,我们需要对前面的输出调用map,并使用reduce() for each 对象生成所需的对象:

const res = x.map((obj) => Object.entries(obj).reduce((p, [k, v]) => ({ ...p, [k]: v.value }), {}))

输出:

[
    {
        "field-1": "a1",
        "field-2": "a2",
        "field-3": "a3"
    },
    {
        "field-1": "b1",
        "field-2": "b2",
        "field-3": "b3"
    }
]

Javascript相关问答推荐

即使设置了父级的最大高度,固定位置的分区内容也不会滚动?

自定义帖子类型帖子未显示在网站上

如何在dataTables PDF输出中正确渲染字形?

通过实现regex逻辑自定义数据表搜索

如何按预期聚合SON数据?

在JavaScript中检索一些文本

使用JavaScript在ionic Web应用程序中更新.pane和.view的背景 colored颜色

将json数组项转换为js中的扁平

Vue:ref不会创建react 性属性

TypScript界面中的Infer React子props

如何使用JavaScript将文本插入空div

使用Java脚本根据按下的按钮更改S文本

如何创建返回不带`new`关键字的实例的类

变量在导入到Vite中的另一个js文件时成为常量.

从逗号和破折号分隔的给定字符串中查找所有有效的星期几

在Odoo中如何以编程方式在POS中添加产品

有没有办法更改Chart.js 3.x.x中主要刻度的字体?

如何在每隔2分钟刷新OKTA令牌后停止页面刷新

如何压缩图像并将其编码为文本?

如何将对象推送到firestore数组?