首页 > 解决方案 > 将数组中的对象映射到单个对象的最佳方法

问题描述

我正在尝试将基于类型的答案属性映射到新的单个对象

const questionsArray = [
  {
    question: `What is your name?`,
    type: "name"
  },
  {
    question: `What is your age?`,
    type: "age"
  }
]

这将导致:

bday = {
          name: 'Jose',
          age: '23',
        }

这将不起作用,因为每个问题都将替换已设置的先前值,因为类型会有所不同

标签: javascriptarrays

解决方案


您可以使用reduce()type用作该键的键和answer

const questionsArray = [  {    id: 0,    question: `What is your name?`,    answer: 'jose',    type: "name"  },  {    id: 1,    question: `What is your birth month?`,    answer: 'January',    type: "month"  },  {    id: 2,    question: `What day in were you born?`,    answer: '24',    type: "day"  },  {    id: 3,    question: `What's your email?`,    answer: 'k@k.gmail.com',    type: 'email'  }]

const res = questionsArray.reduce((ac, {type, answer}) => {
  ac[type] = answer;
  return ac;
}, {});
console.log(res)

type正如您将在上述方式中注意到的那样,除了数组值的属性之外,您不能使用任何其他键。

如果您想在结果对象中使用自定义属性名称,您需要有一个哈希表。

const questionsArray = [  {    id: 0,    question: `What is your name?`,    answer: 'jose',    type: "name"  },  {    id: 1,    question: `What is your birth month?`,    answer: 'January',    type: "month"  },  {    id: 2,    question: `What day in were you born?`,    answer: '24',    type: "day"  },  {    id: 3,    question: `What's your email?`,    answer: 'k@k.gmail.com',    type: 'email'  }]

const table = {
  day: 'birthDay',
  month: 'birthMonth'
}

const res = questionsArray.reduce((ac, {type, answer}) => {
  ac[table[type] || type] = answer;
  return ac;
}, {});
console.log(res)


推荐阅读