我有2个数组,一个有组信息,另一个有字段信息.我想组合这两个数组,以创建适当的分组字段.

API响应如下所示

{
  "type1": [
    {
      "groupId": "1",
      "fieldIds": [
        "field1",
        "field2"
      ]
    },
    {
      "groupId": "2",
      "fieldIds": [
        "field3"
      ]
    }
  ],
  "type2": [
    {
      "groupId": "3",
      "fieldIds": [
        "field4",
        "field5"
      ]
    },
    {
      "groupId": "4",
      "fieldIds": [
        "field3"
      ]
    }
  ],
  "fields": [
    {
      "fieldId": "field1",
      "fieldName": "FName1"
    }...
  ]
}

我希望对字段进行分组,以便输出如下所示

{
  "type1": [
    {
      "groupId": "1",
      "fields": [
        {
          "fieldId": "field1",
          "fieldName": "FName1"
        },
        {
          "fieldId": "field2",
          "fieldName": "FName2"
        }
      ]
    },
    {
      "groupId": "2",
      "fields": [
        {
          "fieldId": "field3",
          "fieldName": "FName3"
        }
      ]
    }
  ],
  "type2": [
    {
      "groupId": "3",
      "fields": [
        {
          "fieldId": "field4",
          "fieldName": "FName4"
        },
        {
          "fieldId": "field5",
          "fieldName": "FName5"
        }
      ]
    }
  ]
}

我已经完成了一种"残酷"的方法,即遍历组, Select fieldID,在field数组中搜索该fieldID,然后将其放入组中. 它是有效的,但我正在寻找的是一些"干净"的方式来做这using lodash chaining.

推荐答案

我的方法是按id对字段进行分组,并创建一个Lookup对象,这样我就可以在O(1)中直接访问它.

然后将对象转换为条目数组,这样我就可以迭代并用实际的字段替换字段ID.之后,转换回对象

首先,我会给非罗达什

const {fields, ...types} = { "type1": [ { "groupId": "1", "fieldIds": [ "field1", "field2" ] }, { "groupId": "2", "fieldIds": [ "field3" ] } ], "type2": [ { "groupId": "3", "fieldIds": [ "field4", "field5" ] }, { "groupId": "4", "fieldIds": [ "field3" ] } ], "fields": [ { "fieldId": "field1", "fieldName": "FName1" }, { "fieldId": "field2", "fieldName": "FName2" }, { "fieldId": "field3", "fieldName": "FName3" }, { "fieldId": "field4", "fieldName": "FName4" }, { "fieldId": "field5", "fieldName": "FName5" } ] }

const groupedFields = fields.reduce((acc,curr) => {
  acc[curr.fieldId] = curr
  return acc
},{})

const result = Object.fromEntries(Object.entries(types).map(([k,v]) => {
  const newV = v.map(({groupId,fieldIds}) => {
    const fields = fieldIds.map(fieldId => groupedFields[fieldId])
    return {groupId,fields}
  })
  return [k,newV]  
}))

console.log(JSON.parse(JSON.stringify(result)))

洛达什溶液

const {fields, ...types} = { "type1": [ { "groupId": "1", "fieldIds": [ "field1", "field2" ] }, { "groupId": "2", "fieldIds": [ "field3" ] } ], "type2": [ { "groupId": "3", "fieldIds": [ "field4", "field5" ] }, { "groupId": "4", "fieldIds": [ "field3" ] } ], "fields": [ { "fieldId": "field1", "fieldName": "FName1" }, { "fieldId": "field2", "fieldName": "FName2" }, { "fieldId": "field3", "fieldName": "FName3" }, { "fieldId": "field4", "fieldName": "FName4" }, { "fieldId": "field5", "fieldName": "FName5" } ] }

const groupedFields = _.groupBy(fields,'fieldId')

const result = _.mapValues(types, (value) => {
  return _.map(value, ({ groupId, fieldIds }) => ({
    groupId,
    fields: _.map(fieldIds, (fieldId) => groupedFields[fieldId][0]),
  }));
});

console.log(JSON.parse(JSON.stringify(result)))
<script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.17.21/lodash.min.js"></script>

Javascript相关问答推荐

JavaScript .Click()函数不起作用

橡皮擦完全让画布变成白色

如何按预期聚合SON数据?

*ngFor和@代表输入decorator 和选角闭合

React:未调用useState变量在调试器的事件处理程序中不可用

如何在表格上拥有水平滚动条,在正文页面上拥有垂直滚动条,同时还对html表格的标题使用位置粘性?

fs. writeFile()vs fs.writeFile()vs fs.appendFile()

如何在angular中从JSON值添加动态路由保护?

有没有可能使滑动img动画以更快的速度连续?

html + java script!需要帮助来了解为什么我得到(无效的用户名或密码)

如何从网站www.example.com获取表与Cheerio谷歌应用程序脚本

我可以使用使用node.js创建的本地主机来存储我网站上提交的所有数据吗?没有SQL或任何数据库.只有HTML语言

为什么我的getAsFile()方法返回空?

WP Bootstrap NavWaker:下拉菜单一次打开所有下拉菜单

Puppeteer上每页的useProxy返回的不是函数/构造函数

如何利用CSS中的隐藏元素实现平滑扩展和防止网格行间隙

AJAX POST在控制器中返回空(ASP.NET MVC)

传递方法VS泛型对象VS事件特定对象

无法设置RazorPay订阅API项目价格

如何调整下拉内容,使其不与其他元素重叠?