Получить ключи объекта для формирования массива объекта не удалось - PullRequest
0 голосов
/ 23 октября 2018

У меня есть этот объект,

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'}], что не так с моим снижением?

Ответы [ 3 ]

0 голосов
/ 23 октября 2018

Проблема в том, что используется индекс функции 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.

0 голосов
/ 23 октября 2018

Если вы не хотите использовать 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)
0 голосов
/ 23 октября 2018

Вам также потребуется выполнить итерацию и вернуть все уникальные ключи внутри каждого внутреннего объекта

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))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...