我有这个对象
let obj = {
"question_1": {
answers: {
"en": "How are you?",
"cn": "ni hao ma"
}
}}
我想像[{value: 'en'}, {value: 'cn'}]
我尝试过
const result = Object.entries(obj).reduce((accum, [key, val], i) => {
accum = [...accum, {value: Object.keys(val.answers)[i] }]
return accum
}, [])
我只有[{value: 'en'}]
,我的reduce有什么问题?
答案 0 :(得分:0)
您还需要迭代并返回每个内部对象内的所有唯一键
let obj = {
"question_1": {
answers: {
"en": "How are you?",
"cn": "ni hao ma"
}
},
"question_2": {
answers: {
"en": "How are you?",
"cn": "ni hao ma"
}
}
}
const result = Object.entries(obj).reduce((accum, [key, val], i) => {
Object.keys(val.answers).forEach(lang => {
accum = {...accum, [lang]: {value: lang}}
})
return accum
}, {});
console.log(Object.values(result))
答案 1 :(得分:0)
问题是使用reduce
函数的索引,该索引在Object.entities
结果上运行,而不是内部Object.keys
。我相信一种更好的方法是像这样散布Object.keys
的映射数组:
const result = Object.entries(obj).reduce((accum, [key, val], i) => {
accum = [...accum, ...Object.keys(val.answers).map(value => ({ value }))]
return accum
}, [])
这将为您提供所需的内容,但是请注意,如果更多问题具有相同的答案键,您将在result
数组中得到重复项。
答案 2 :(得分:0)
如果不想使用reduce,则可以迭代键,然后将它们以块的形式推入数组,并在推压时散布:
let obj = {
"question_1": {
answers: {
"en": "How are you?",
"cn": "ni hao ma"
}
},
"question_2": {
answers: {
"fr": "Comment ca va"
}
}
}
const valueArray = []; /* array to push to */
Object.keys(obj).forEach(key => {
valueArray.push(...Object.keys(obj[key].answers).map(value => {
return {
value
}
}));
});
console.log(valueArray)