Преобразование вложенного массива объектов в объект пар ключ-значение с помощью редуктора - PullRequest
0 голосов
/ 30 мая 2020

У меня наблюдаемый результат, как показано ниже. Я хочу преобразовать эти данные в желаемый формат (как показано ниже). Мне частично удалось сформировать пары ключ-значение, но я не мог понять, как отправить только одно поле (для которого selected имеет значение true ) из массива cars для окончательного вывода.

* ** Наблюдаемый результат ****

[{
  "name":"John",
  "age":30,
  "cars": [
      { "selected":true,  "name":"Ford", "models": "Mustang"},
      { "selected":false, "name":"BMW", "models": "320" },
      { "selected":true, "name":"Fiat", "models":"500" }
  ]
 },
 {
  "name":"alex",
  "age":40,
  "cars": [
      { "selected":true,  "name":"tesla", "models": "x"},
      { "selected":false, "name":"merc", "models": "300" },
      { "selected":true, "name":"honda", "models":"accord" }
   ]
  }
]

**** Требуемый формат *****

{John:[ford, fiat], Alex:[tesla,honda]} 

*** Используемый код *****

const results = item.reduce((r,{name,cars}) => (r[name]=cars,r), {})

// Это дает мне полный объект cars, но мне нужно только имя от него (и это тоже для выбранных истинных).

Редактировать 1: Не хочу иметь пустую запись в финале объект. Например, если у Alex нет выбранных автомобилей Cars Selected True, я не хочу, чтобы Alex: [] был в конечном объекте.

Ответы [ 2 ]

2 голосов
/ 30 мая 2020

этот фрагмент поможет

 const array = [{
  "name":"John",
  "age":30,
  "cars": [
      { "selected":true,  "name":"Ford", "models": "Mustang"},
      { "selected":false, "name":"BMW", "models": "320" },
      { "selected":true, "name":"Fiat", "models":"500" }
  ]
 },
 {
  "name":"alex",
  "age":40,
  "cars": [
      { "selected":true,  "name":"tesla", "models": "x"},
      { "selected":false, "name":"merc", "models": "300" },
      { "selected":true, "name":"honda", "models":"accord" }
   ]
  }
]


const newArray = array.reduce((acc, rec) => {
  const cars = rec.cars.filter(c => c.selected)

  return cars.length ? {...acc, [rec.name]: cars.map(c => c.name)} : acc
}, {})

console.log(newArray)
1 голос
/ 30 мая 2020

используйте forEach и создайте объект

Обновление: другое решение с использованием reduce

data = [
  {
    name: "John",
    age: 30,
    cars: [
      { selected: true, name: "Ford", models: "Mustang" },
      { selected: false, name: "BMW", models: "320" },
      { selected: true, name: "Fiat", models: "500" },
    ],
  },
  {
    name: "alex",
    age: 40,
    cars: [
      { selected: false, name: "tesla", models: "x" },
      { selected: false, name: "merc", models: "300" },
      { selected: false, name: "honda", models: "accord" },
    ],
  },
];


const output = data.reduce((acc, { name, cars }) => {
  const items = cars.filter(({selected}) => selected).map(({name}) => name);
  if (items.length > 0) {
     acc[name] = items;
  }
  return acc;
}, {});

console.log(output);
...