#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. Я разговариваю по мобильному телефону