Добавить последовательные буквы алфавита в качестве ключей объекта - PullRequest
0 голосов
/ 13 сентября 2018

Я хочу создать объект с заданной структурой:

const questions = [
  {
    id: '1',
    instruction: 'Question1',
    options: {
      'a': 'SomeText1',
      'b': 'SomeText2',
      'c': 'SomeText3'
    },
    correct: ['c']
  },
  {
    id: '2',
    instruction: 'Question2',
    options: {
      'a': 'SomeText1',
      'b': 'SomeText2',
      'c': 'SomeText3',
      'd': 'SomeText4'
    },
    correct: ['a']
  },
  {
    id: '3',
    instruction: 'Question3,
    options: {
      'a': 'SomeText1',
      'b': 'SomeText2'
    },
    correct: ['b']
  }
]

У меня есть массивы, содержащие необходимую информацию для заполнения этого объекта и создания его с использованием .map().

const questions = 
[ 'Question1',
  'Question2',
  'Question3'
]

const answers = 
[ 
 'Answer1',
 'Answer2',
 'Answer3'
]

const options = [
   [ 'Option1', 'Option2', 'Option3' ],
   [ 'Option4', 'Option5', 'Option6' ],
   [ 'Option7', 'Option8', 'Option9' ]
 ]

function toJson()
  const alphabet = ['a', 'b', 'c', 'd', 'e'];
  const json = questions.map((question, index) => (
    {
      id: index + 1,
      instruction: question,
      options: Object.assign({}, options[index]),
      correct: answers[index]
    }
  ))
}

У меня проблема только с ключом options.Как видите, я хочу иметь буквы в качестве ключей, в зависимости от того, сколько ответов на вопрос.Эта функция дает мне цифры в качестве ключей, когда я использую Object.assign(), и я не знаю, как заменить их на буквы из массива alphabet.

РЕДАКТИРОВАТЬ:

Так что решение дляoptions ключ в желаемом объекте:

options: Object.assign(
        {}, 
        ...options[index].map((a, i) => ({ [alphabet[i]]: a }))
      ),

Теперь я могу создать объект с последовательными буквами алфавита с назначенным ответом.

Ответы [ 4 ]

0 голосов
/ 13 сентября 2018

EDIT:

Таким образом, решение для ключа опций в желаемом объекте:

options: Object.assign(
        {}, 
        ...options[index].map((a, i) => ({ [alphabet[i]]: a }))
      ),
0 голосов
/ 13 сентября 2018

ниже должно работать (я считаю)

options: alphabet.reduce((acc, letter, i) => {
    let option = options[index][i] || 'DefaultText' + i;
    acc[letter] = option;

    return acc;

}, {})

Редактировать: Исправлены опечатки

0 голосов
/ 13 сентября 2018

options[index] возвращает массив.Содержит значения по индексу.Передав его в Object.assign, вы добавляете все значения по их индексу массива в виде строки: "0", "1" и т. Д.

Если мы map массив в список { "a": option } сначала и распространяя результат на вызов Object.assign, мы можем изменить эти индексы на буквы, которые вы хотите:

const questions = 
[ 'Question1',
  'Question2',
  'Question3'
]

const answers = 
[ 
 'Answer1',
 'Answer2',
 'Answer3'
]

const options = [
   [ 'Option1', 'Option2', 'Option3' ],
   [ 'Option4', 'Option5', 'Option6' ],
   [ 'Option7', 'Option8', 'Option9' ]
 ]

function toJson() {
  const alphabet = ['a', 'b', 'c', 'd', 'e'];
  const json = questions.map((question, index) => (
    {
      id: index + 1,
      instruction: question,
      options: Object.assign(
        {}, 
        ...options[index].map((a, i) => ({ [alphabet[i]]: a }))
      ),
      correct: answers[index]
    }
  ));
  
  return json;
}

console.log(toJson());
0 голосов
/ 13 сентября 2018

Я предлагаю использовать что-то вроде zip и objectFromPairs (оба фрагмента из 30secondsofcode , проект / веб-сайт, который я поддерживаю). С сайта:

застежка-молния

Создает массив элементов, сгруппированных по позиции в исходных массивах.

Используйте Math.max.apply(), чтобы получить самый длинный массив в аргументах. Создает массив с этой длиной в качестве возвращаемого значения и использует Array.from() с map-функцией для создания массива сгруппированных элементов. Если длины массивов аргументов различаются, то используется undefined, где не может быть найдено значение.

objectFromPairs

Создает объект из заданных пар ключ-значение.

Используйте Array.reduce() для создания и объединения пар ключ-значение.

Единственный дополнительный шаг, который я предпринял, заключался в том, чтобы обрезать каждый сжатый массив до length из options[index].

const questions = ['Question1',
  'Question2',
  'Question3'
]

const answers = [
  'Answer1',
  'Answer2',
  'Answer3'
]

const options = [
  ['Option1', 'Option2', 'Option3'],
  ['Option4', 'Option5', 'Option6'],
  ['Option7', 'Option8', 'Option9']
]

const zip = (...arrays) => {
  const maxLength = Math.max(...arrays.map(x => x.length));
  return Array.from({
    length: maxLength
  }).map((_, i) => {
    return Array.from({
      length: arrays.length
    }, (_, k) => arrays[k][i]);
  });
};

const objectFromPairs = arr => arr.reduce((a, [key, val]) => ((a[key] = val), a), {});


function toJson() {
  const alphabet = ['a', 'b', 'c', 'd', 'e'];
  const json = questions.map((question, index) => ({
    id: index + 1,
    instruction: question,
    options: objectFromPairs(zip(alphabet, options[index]).slice(0, options[index].length)),
    correct: answers[index]
  }))
  console.log(json);
}

toJson();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...