Как объединить объект в массив в Javasript с циклом

#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 = {} ).