获取对象的键以形成对象数组失败

时间:2018-10-23 07:16:42

标签: javascript ecmascript-6

我有这个对象

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有什么问题?

3 个答案:

答案 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)