当前方法:
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
}
}
这是否可以在不使用result
和innerResult
等可变变量的情况下实现,我可以直接从映射或沿着这些线返回这个结构吗。。。
例如:
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())