[英]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.