使用这样的对象数组:
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对象添加一次constraints和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)),
],
},
}))我错过了什么阻碍了预期的结果?
发布于 2018-10-02 16:30:03
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);https://stackoverflow.com/questions/52612422
复制相似问题