Как преобразовать массив объектов в пары ключ-значение

#javascript #arrays

Вопрос:

 var contacts = [  { account: "Acme", firstName: "John", lastName: "Snow" },  { account: "Metal Industries", firstName: "Ted", lastName: "Smith" },  { account: "Acme", firstName: "Sara", lastName: "Butler" },  { account: "HiTech Corp", firstName: "Sam", lastName: "Johnson" },  { account: "HiTech Corp", firstName: "Arnold", lastName: "Williams" },  { account: "Metal Industries", firstName: "Jessica", lastName: "Westcoat" },  { account: "Acme", firstName: "Kyle", lastName: "Johnson" },  { account: "HiTech Corp", firstName: "Jason", lastName: "Fernandez" }  ];  

Цель состоит в том, чтобы получить этот результат:

 result = {  "Acme": ["John Snow", "Kyle Johnson", "Sara Butler"],  "HiTech Corp": ["Arnold Williams", "Jason Fernandez", "Sam Johnson"],  "Metal Industries": ["Jessica Westcoat", "Ted Smith"]  }  

Моя функция ниже не возвращает массив значений, а возвращает только последнее значение

 const convertArrayToObject = (array, key) =gt; {  const initialValue = {}  return array.reduce((obj, item) =gt; {  return {...obj,[item[key]]: item,}  }, initialValue)  }  

Выход

Любая помощь будет признательна

Ответ №1:

Вы были близки, просто не хватало того, что при настройке объекта в результирующем массиве вам нужно установить его как массив — в этом сценарии это было бы [k]: [v] и не [k]: v

 var contacts = [  { account: "Acme", firstName: "John", lastName: "Snow" },  { account: "Metal Industries", firstName: "Ted", lastName: "Smith" },  { account: "Acme", firstName: "Sara", lastName: "Butler" },  { account: "HiTech Corp", firstName: "Sam", lastName: "Johnson" },  { account: "HiTech Corp", firstName: "Arnold", lastName: "Williams" },  { account: "Metal Industries", firstName: "Jessica", lastName: "Westcoat" },  { account: "Acme", firstName: "Kyle", lastName: "Johnson" },  { account: "HiTech Corp", firstName: "Jason", lastName: "Fernandez" }  ];   const convertArrayToObject = (array, key) =gt; {  const initialValue = {}  return array.reduce((obj, item) =gt; {  let k = item[key], v=item.firstName   ' '   item.lastName;  if (obj[k]) obj[k].push(v);  else obj = { ...obj, [k]: [v] }  return obj  }, initialValue) }  console.log(convertArrayToObject(contacts, 'account')) 

Ответ №2:

 var contacts = [  { account: "Acme", firstName: "John", lastName: "Snow" },  { account: "Metal Industries", firstName: "Ted", lastName: "Smith" },  { account: "Acme", firstName: "Sara", lastName: "Butler" },  { account: "HiTech Corp", firstName: "Sam", lastName: "Johnson" },  { account: "HiTech Corp", firstName: "Arnold", lastName: "Williams" },  { account: "Metal Industries", firstName: "Jessica", lastName: "Westcoat" },  { account: "Acme", firstName: "Kyle", lastName: "Johnson" },  { account: "HiTech Corp", firstName: "Jason", lastName: "Fernandez" }  ];  const convertArrayToObject = (array, key) =gt; {  const initialValue = {}  array.forEach((obj, item) =gt; {  initialValue[obj[key]] = initialValue[obj.account] || []  initialValue[obj[key]].push(`${obj.firstName} ${obj.lastName}`)  })  return initialValue }  console.log(convertArrayToObject(contacts, 'account'))