#javascript #arrays
#javascript #массивы
Вопрос:
У меня есть такой массив в javascript,
data = [
{
item: "Banana",
path: "fruit"
},
{
message: "Volvo",
path: "car"
},
{
message: "Cat",
path: "animal"
}
]
И мне нужно создать новый объект, подобный этому,
data = {
fruit: "Banana",
car: "Volvo",
animal: "Cat"
}
Я попробовал этот цикл,
var newData = [];
data.map(value => {
newData[value.path] = value.message
});
Но этот цикл продолжает возвращать данные следующим образом,
data = [
{
fruit: "Banana"
},
{
car: "Volvo"
},
{
animal: "Cat"
}
]
Как решить подобный случай?
Спасибо
Ответ №1:
Вы могли бы использовать .reduce
const data = [
{
item: 'Banana',
path: 'fruit'
},
{
message: 'Volvo',
path: 'car'
},
{
message: 'Cat',
path: 'animal'
}
]
const res = data.reduce((acc, el) => ({ ...acc, [el.path]: el.message || el.item }), {})
console.log(res)
Или продолжайте с вашим решением, но вместо этого измените array []
на object {}
const data = [
{
item: 'Banana',
path: 'fruit'
},
{
message: 'Volvo',
path: 'car'
},
{
message: 'Cat',
path: 'animal'
}
]
var newData = {}
data.map(value => {
newData[value.path] = value.message || value.item
})
console.log(newData)
Комментарии:
1. Большое вам спасибо, я не понял, что забыл изменить тип исходных новых данных. Хорошая работа!
Ответ №2:
Попробуйте использовать Array.prototype.reduce
вместо Array.prototype.map
:
const data = [{ message: "Banana", path: "fruit" }, { message: "Volvo", path: "car"}, { message: "Cat", path: "animal" }];
const merge = (data) => {
return data.reduce((acc, o) => {
acc[o.path] = o.message;
return acc;
}, {});
}
console.log(merge(data));
Ответ №3:
Вы могли бы создать объект с записями.
const
data = [{ item: "Banana", path: "fruit" }, { message: "Volvo", path: "car" }, { message: "Cat", path: "animal" }],
object = Object.fromEntries(data.map(({ item, message, path }) =>
[path, item || message]
));
console.log(object);
Ответ №4:
Внутри .map
обратного вызова верните новый объект (не просто присвоение свойства), где ключ объекта является path
ключом в объекте, а значение является значением первого не path
ключа:
const data = [
{
item: "Banana",
path: "fruit"
},
{
message: "Volvo",
path: "car"
},
{
message: "Cat",
path: "animal"
}
];
const newData = data.map(({ path, ...rest }) => ({
[path]: Object.values(rest)[0]
}));
console.log(newData);
Ответ №5:
Ваше решение почти идеально! Для этого случая рекомендуется использовать обозначения в квадратных скобках, как вы это делаете.
Вы можете достичь желаемого результата, заполнив свойства пустого объекта вместо сопоставления значений. Вот так:
var newData = {};
data.forEach(value => {
newData[value.path] = value.message;
});
Это потому, что ваш ожидаемый результат — это не массив ( var newData = []
), а объект ( var newData = {}
).