javascript - 将键从另一个对象合并到嵌套对象中
问题描述
使用一组对象,例如:
const activities = [{
id: 11129,
recap: {
id: 11129,
recapValues: [
{
id: 1,
internalName: 'Foo',
},
{
id: 2,
internalName: 'Bar',
},
{
id: 6,
internalName: 'Bongo',
},
],
},
},
{
id: 11130,
recap: {
id: 11130,
recapValues: [
{
id: 4,
internalName: 'Bingo',
},
{
id: 5,
internalName: 'Bango',
},
{
id: 6,
internalName: 'Bongo',
},
],
},
}]
我的目标是通过匹配引用对象数组中的键来为每个嵌套对象添加一个responseOptions
和键,例如:constraints
recapValues
internalName
const questions = [{
internalName: 'Foo',
responseOptions: null,
constraints: {
date: {},
},
},
{
internalName: 'Bar',
responseOptions: {},
constraints: null,
},
{
internalName: 'Bango',
responseOptions: null,
constraints: null,
},
{
internalName: 'Bingo',
responseOptions: {},
constraints: null,
},
{
internalName: 'Bongo',
responseOptions: null,
constraints: {
time: {},
},
}]
对于预期结果:
[{
id: 11129,
recap: {
id: 11129,
recapValues: [
{
id: 1,
internalName: 'Foo',
responseOptions: null,
constraints: {
date: {},
},
},
{
id: 2,
internalName: 'Bar',
responseOptions: {},
constraints: null,
},
{
id: 6,
internalName: 'Bongo',
responseOptions: {},
constraints: {
time: {},
},
},
],
},
},
{
id: 11130,
recap: {
id: 11130,
recapValues: [
{
id: 4,
internalName: 'Bingo',
responseOptions: null,
constraints: null,
},
{
id: 5,
internalName: 'Bango',
responseOptions: {},
constraints: null,
},
{
id: 6,
internalName: 'Bongo',
responseOptions: {},
constraints: {
time: {},
},
},
],
},
}]
我的尝试导致下面的代码只为每个对象添加一次responseOptions
andconstraints
键,而不是为里面的每个单独的问题:recapValues
recapValues
activities.map(activity => ({
...activity,
recap: {
...activity.recap,
recapValues: [
...activity.recap.recapValues,
...activity.recap.recapValues
.forEach(q => questions
.find(obj => obj.internalName === q.internalName)),
],
},
}))
我错过了什么阻止了预期的结果?
解决方案
forEach
返回undefined
并且您想要map
recapValues:
activities.map(activity => ({
...activity,
recap: {
...activity.recap,
recapValues: activity.recap.recapValues.map(value => ({
...value,
...questions.find(obj => obj.internalName === value.internalName),
}),
},
}))
我们可以通过使用映射函数来美化一点:
const mapObj = (key, mapper) => ({ [key]: val, ...rest }) => ({ [key]: mapper(val), ...rest });
const map = mapper => arr => arr.map(mapper);
const format = map(
mapObj("recap",
mapObj("recapValues",
map(value => ({
...value,
...questions.find(q => q.internalName === value.internalName)
}))
)
)
);
const output = format(activities);
推荐阅读
- python-3.x - 我只想要函数的距离值
- function - 如何使用(def)函数内部的变量?
- android-recyclerview - 如何预加载像 instagram feed 这样的帖子
- python - 为什么硒不能点击元素?
- awk - 具有更多实例和空间的 awk 循环
- php - MAATWEBSITE LARAVEL
- html - 为什么 margin-bottom 属性对我的浮动元素不起作用?
- bash - 使用 sed 仅匹配环境变量中的第一个数字序列
- java - 是否可以使用 HTMLDocument 添加属性?
- flutter - 通过 Mockito 对嵌套值使用 any 或 anyNamed 匹配器