преобразование массива объектов в карту значений полей структура javascript

#javascript #arrays #object

Вопрос:

У меня есть массив объектов, подобных этому:

 const arr=[
{ name:"test",
  class:3
},
{ name:"test2",
  class:4
},
{ name:"test3",
  class:5
},]
 

Теперь я должен преобразовать его в структуру, подобную карте, как показано ниже:

 const map={
"name":["test","test2","test3"],
"class":[3,4,5]
}
 

Я понятия не имею, как создать такую структуру.Любые зацепки будут оценены по достоинству.

Комментарии:

1. Взгляните на Array.prototype.reduce()

2. повторите arr и вставьте данные в карту (кстати, было бы лучше не использовать карту имен, чтобы избежать путаницы с .map, принадлежащей массивам)

3. Являются name ли и class фиксированные значения? Это единственные свойства? Будут ли все объекты всегда иметь оба свойства? Если нет, то какова будет стоимость полученного объекта в этом случае?

4. Я попытался повторить их, используя карту

Ответ №1:

Если у вас произвольное количество ключей, вы можете использовать Object.entries() для получения всех пар значений ключей. Затем просто зациклите все записи и добавьте их в конечный результат.

 const arr=[{name:"test",class:3},{name:"test2",class:4},{name:"test3",class:5}];

const map = arr.reduce((acc, obj) => {
  for(const [key, value] of Object.entries(obj)) {
    if(acc[key]) {
      acc[key].push(value);
    }else{
      acc[key] = [value];
    }
  }
  
  return acc;
}, {});

console.log(map); 

Ответ №2:

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

 const arr=[{name:"test",class:3},{name:"test2",class:4},{name:"test3",class:5}];

function getData(arr, prop) {
  return arr.map(obj => obj[prop]);
}

const map = {
  name: getData(arr, 'name'),
  class: getData(arr, 'class')
}

console.log(map); 

Комментарии:

1. Что не так с ответом?

Ответ №3:

Это должно быть что-то вроде этого

 arr.reduce((res, obj) => {
   Object.entries(obj).forEach(([k,v]) =>     {
     if(!res[k]) res[k] = []
     res[k].push(v)
   })
    return res
},{})
 

Комментарии:

1. да, это не сработало

2. Да, возврат должен быть за пределами foreach. Я разговариваю по мобильному телефону