【发布时间】:2020-05-30 00:06:35
【问题描述】:
我有一个如下所示的可观察输出。我想将此数据转换为所需的格式(如下提供)。我部分成功地形成了键值对,但不知道如何只将一个字段(即 selected 为 true)从汽车数组发送到最终输出。
***可观察的输出****
[{
"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), {})
//这给了我完整的汽车对象,但我只需要从中命名(对于选定的真实对象也是如此)。
编辑1:不想在最终对象中有空记录。例如,如果 Alex 没有任何 Cars Selected True 那么我不希望 Alex:[] 在最终对象中。
【问题讨论】:
-
const results = data.reduce((r,{name,cars}) => (r[name]=cars.filter(ch => ch.selected).map(ch => ch.name),r), {});可能是这样的? -
@Halili Cakar。谢谢,这就像一个魅力。如果我只想在至少有一个值的情况下返回 'r' 怎么办。例如,在上面的 Alex 示例中,如果没有一辆车选择 true,那么结果不应该有 Alex 记录。
-
嘿@Raji 我很高兴它对你有用。如果您想过滤只有汽车的结果,您可能想先过滤并再次使用此功能减少它。所以试试这个;
data.filter(ch => ch.cars.some(car => car.selected)).reduce((r,{name,cars}) => (r[name]=cars.filter(ch => ch.selected).map(ch => ch.name),r), {})
标签: javascript arrays rxjs