我有这个数据结构:
[{
id : 1,
name : "Item 1",
subItems : [{
id : 1,
name : "SubItem 1"
},{
id : 2,
name : "SubItem 2"
}
]
}, {
id : 2,
name : "Item 2",
subItems : [{
id : 3,
name : "SubItem 3"
}, {
id : 4,
name : "SubItem 4"
}
]
}]
我对Web服务进行以下调用以获取项目:
this.dataService.get("items")
返回的是Observable<Item[]>
。我可以使用哪些Observable运算符来获取SubItems的连接列表?我想最终得到这样的东西:
[{
id : 1,
name : "SubItem 1"
}, {
id : 2,
name : "SubItem 2"
},
{
id : 3,
name : "SubItem 3"
}, {
id : 4,
name : "SubItem 4"
}]
我应该使用flatMap
或concat
吗?
答案 0 :(得分:1)
如果它是一个拼写错误,第二个元素也有subItems
(而不是searchProfiles
),你不需要flatMap或任何类似的东西,你可以在使用js数组运算符的普通映射:
var transformed = [].concat(...result.map(item => item.subItems));
或在你的情况下
httpResult$.map(result => [].concat(...result.map(item => item.subItems))
如果故意使用不同的键,你的内部地图将需要更多的逻辑,但映射将完全相同
答案 1 :(得分:1)
您希望第一个 @IBAction func submitTapped(_ sender: UIButton) {
var gradeMS = ""
if (gradeTF.text?.isEmpty)! {
gradeMS = "Please enter point total"
}
else {
let grade : Int = Int(gradeTF.text!)!
guard let name = nameGR.text! else {
print("Uups. We might want to handle empty textfield here")
return
}
if grade > 1000 {
gradeMS = "ERROR - Invalid point total"
label1.text = gradeMS
}
else if grade > 900 && grade <= 1000 {
gradeMS = "\(name)'s grade is \"A\""
label1.text = gradeMS
}
else if grade > 800 && grade <= 900 {
gradeMS = "\(name)'s grade is \"B\""
label1.text = gradeMS
}
else if grade > 700 && grade <= 800 {
gradeMS = "\(name)'s grade is \"C\""
label1.text = gradeMS
}
else if grade > 600 && grade <= 700 {
gradeMS = "\(name)'s grade is \"D\""
label1.text = gradeMS
}
else {
gradeMS = "\(name)'s grade is \"F\""
label1.text = gradeMS
}
}
}
运算符仅提取您需要的字段,并使用map()
展平对象数组(对于更高阶的Observable,这是一个小技巧,请参阅{{3} }了解更多信息):
concatAll()
打印到控制台:
var data = [{
id : 1,
name : "Item 1",
subItems : [
{ id : 1, name : "SubItem 1" },
{ id : 2, name : "SubItem 2" }
]
}, {
id : 2,
name : "Item 2",
searchProfiles : [
{ id : 3, name : "SubItem 3" },
{ id : 4, name : "SubItem 4" }
]
}];
Observable.from(data)
.map(item => {
if (item.searchProfiles) {
return item.searchProfiles;
} else if (item.subItems) {
return item.subItems
}
})
.concatAll()
.subscribe(val => console.log(val));
或者,如果您确实希望将输出作为单个数组,则可以在{ id: 1, name: 'SubItem 1' }
{ id: 2, name: 'SubItem 2' }
{ id: 3, name: 'SubItem 3' }
{ id: 4, name: 'SubItem 4' }
和toArray()
之间添加.concatAll()
运算符,并且您将收到:
.subscribe(...)