从映射返回嵌套对象



当前方法:

function stuff() {
const days = ['monday', 'tuesday', 'wednesday', 'thursday', 'friday']
const names ['tom', 'dave', 'kate', 'jane', 'james']
const result = {}
days.map(day => {
const innerResult = {}
names.map(name => {
// some logic
const res = {
result: 'some result'
}
innerResult[name] = res
})
result[day] = innerResult
})
return result
}

看起来像:

{
"monday": {
"tom": {
result: 'some result'
},
"dave": {
result: 'some result'
},
"kate": {
result: 'some result'
},
"jane": {
result: 'some result'
},
"james": {
result: 'some result'
},
},
"tuesday": {
// ...etc
}
}

这是否可以在不使用resultinnerResult等可变变量的情况下实现,我可以直接从映射或沿着这些线返回这个结构吗。。。

例如:

function stuff() {
const days = ['monday', 'tuesday', 'wednesday', 'thursday', 'friday']
const names ['tom', 'dave', 'kate', 'jane', 'james']
return days.map(day => {
return { [day]: names.map(name => {
return {
[name]: { result: 'some result' }
}
})}
})
}

很明显,上面的结构不匹配,但沿着这些线,任何帮助都将不胜感激。

您可以使用Object.fromEntries()从条目数组中创建对象。

const days = ['monday', 'tuesday', 'wednesday', 'thursday', 'friday']
const names = ['tom', 'dave', 'kate', 'jane', 'james']
const output = Object.fromEntries(
days.map(day => 
[ 
day, 
Object.fromEntries( names.map(n => [n, { result: 'value' }]) ) 
]
)
)
console.log(output)


您可以像问题中那样创建一个单独对象的数组。然后使用Object.assign()将它们合并为单个对象

const days = ['monday', 'tuesday', 'wednesday', 'thursday', 'friday'],
names = ['tom', 'dave', 'kate', 'jane', 'james'],

// merges an array of objects into one
merge = arr => Object.assign(...arr), 
getNested = names => names.map(n => ({ [n]: {result: 'value' } }) ),
output2 = merge( days.map(day => ({ [day]: merge(getNested(names)) })) )
console.log(output2)

您可以使用reduce 而不是map

function stuff() {
const days = ['monday', 'tuesday', 'wednesday', 'thursday', 'friday'];
const names = ['tom', 'dave', 'kate', 'jane', 'james'];
return days.reduce((previousValue, currentValue) => { 
previousValue[currentValue] = names.reduce((previous, current) => {
previous[current] = { result: 'some result' };
return previous;
}, {});
return previousValue;
}, {});    
}
console.log(stuff())

最新更新