简体   繁体   English

使用 reducer 将嵌套的对象数组转换为键值对的 object

[英]Convert nested array of objects to object of key-value pairs using reducer

I have an observable output like below.我有一个可观察的 output 如下所示。 I want to convert this data to desired format(proivded below).我想将此数据转换为所需的格式(如下提供)。 I am partially successful forming key value pairs but couldn't figure out how to send only one field(that is for which selected is true ) from the cars array to final output.我部分成功地形成了键值对,但无法弄清楚如何仅将一个字段(即selected 为 true )从汽车数组发送到最终 output。

***Observable Output**** ***可观察的输出***

[{
  "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" }
   ]
  }
]

****Desired Format***** ****所需格式*****

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

***Code used***** ***使用的代码*****

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

//This gives me complete cars object but i need only name from it(and that too for selected true ones). //这给了我完整的汽车 object 但我只需要它的名称(对于选定的真实汽车也是如此)。

Edit 1: Do not want to have empty record in the final object.编辑 1:不想在最终的 object 中有空记录。 For eg, if Alex does not have any Cars Selected True then i do not want Alex:[] in the final object.例如,如果 Alex 没有任何 Cars Selected True,那么我不希望 Alex:[] 在最终的 object 中。

this snippet will help这个片段会有所帮助

 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)

use forEach and build an object使用forEach并构建一个 object

Update: another solution using reduce更新:使用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);

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM