Js помещает значение в массив объектов

#javascript #arrays

#javascript #массивы

Вопрос:

у меня есть следующий массив объектов

  datasets: [{
    data: [],
    backgroundColor: [
        "#FF6384",
        "#4BC0C0",
        "#FFCE56",
        "#E7E9ED",
        "#36A2EB"
    ],
    label: 'My dataset' // for legend
}],
labels: []
};
  

и у меня есть другой массив объектов, подобный приведенному ниже

 [
{
"PORT": "MY",
"Country Name": "AUSTRALIA",
"nocontainers": "1017"
},
{
"PORT": "MY"
"Country Name": "CAMBODIA",
"nocontainers": "1"
},
{
"PORT": "DE"
"Country Name": "CHINA",
"nocontainers": "13846"
},
{
"PORT": "DE"
"Country Name": "HONG KONG",
"nocontainers": "252"
},
{
"PORT": "MY"
"Country Name": "INDONESIA",
"nocontainers": "208"
}
  

что я хочу, так это перенести все значение из ‘nocontainers’ в ключ ‘data’ и значение из ‘Название страны’ в ключ ‘labels’ в первом массиве.

я пробовал array.push, но не сработало, мой окончательный массив должен выглядеть следующим образом

  datasets: [{
    data: [1017, 1, 13846, 252, 208],
    backgroundColor: [
        "#FF6384",
        "#4BC0C0",
        "#FFCE56",
        "#E7E9ED",
        "#36A2EB"
    ],
    label: 'My dataset' // for legend
}],
labels: ["AUSTRALIA (MY)","CAMBODIA (MY)","CHINA (DE)","HONG KONG (DE)","INDONESIA (MY)"]
};
  

Ответ №1:

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

Смотрите рабочий пример ниже:

 const countries = [{PORT:"MY","Country Name":"AUSTRALIA",nocontainers:"1017"},{PORT:"MY","Country Name":"CAMBODIA",nocontainers:"1"},{PORT:"DE","Country Name":"CHINA",nocontainers:"13846"},{PORT:"DE","Country Name":"HONG KONG",nocontainers:"252"},{PORT:"MY","Country Name":"INDONESIA",nocontainers:"208"}];

const obj = {
  datasets: {
    data: [],
    backgroundColor: ["#FF6384", "#4BC0C0", "#FFCE56", "#E7E9ED", "#36A2EB"],
    label: 'My dataset'
  },
  labels: []
};

obj.datasets.data = countries.map(({nocontainers: nc}) =>  nc);
obj.labels = countries.map(({"Country Name": cn, PORT: p}) => `${cn} (${p})`);

console.log(obj);  

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

1. Обратите внимание, что он хотел изменить исходный объект, возможно, вам следует привести альтернативный пример: obj.datasets.data = countries.map(...) и obj.labels = countries.map(...) . В любом случае 1!

2. что, если я хочу объединить новое значение порта с объектом country в скобках?

3. @Eliteuser Я не совсем понимаю ваш вопрос. Отредактируйте свой вопрос (оставив оригинал нетронутым) с помощью обновленного вопроса, предоставляя ожидаемый результат.

4. @Shidersz спасибо, я решил изменить свой первоначальный ответ 🙂

5. @NickParsons прошу прощения за это. я просто думал, что я хочу, чтобы значение ‘PORT’ отображалось перед в новом массиве, как эти метки: [«АВСТРАЛИЯ (МОЯ)», «КАМБОДЖА (МОЯ)», «КИТАЙ (DE)», «ГОНКОНГ (DE)», «ИНДОНЕЗИЯ (МОЯ)»]

Ответ №2:

 let data = {
  datasets: {
    data: [],
    backgroundColor: [
      "#FF6384",
      "#4BC0C0",
      "#FFCE56",
      "#E7E9ED",
      "#36A2EB"
    ],
    label: 'My dataset' // for legend
  },
  labels: []
}
let arr = [{
    "Country Name": "AUSTRALIA",
    "nocontainers": "1017"
  },
  {
    "Country Name": "CAMBODIA",
    "nocontainers": "1"
  },
  {
    "Country Name": "CHINA",
    "nocontainers": "13846"
  },
  {
    "Country Name": "HONG KONG",
    "nocontainers": "252"
  },
  {
    "Country Name": "INDONESIA",
    "nocontainers": "208"
  }
]
arr.forEach(a => {
  data.datasets.data.push(a['nocontainers'])
  data.labels.push(a['Country Name'])
})
console.log(data)