【问题标题】:Rxjs: unable to access array elements in subscribeRxjs:无法访问订阅中的数组元素
【发布时间】:2018-03-11 08:43:23
【问题描述】:

我正在使用以下方法在我的 Ionic 应用程序中检索 AngularFireStoreCollection

this.analysisProvider.getAllOrders().valueChanges()
 .map(ordercoll=>ordercoll)
 .pipe(mergeMap(orddoc=>orddoc)).map(ord=>ord.orderdetails).map(res=>res)
 .subscribe(val=>{
 console.log('res=',val);  
})

console.log 给出以下输出

现在我实际上想访问 partprice 属性,应用过滤器并减少以从所有文档中获取总价值。但是,我无法从 subscribe 函数中的 val 值访问任何内容。我尝试在订阅中关注

  1. console.log('val=',val.partprice); 输出:val=undefined

  2. val.forEach(v=> console.log('val=',v.partprice));
    输出:类型 '{ partname: string; 上不存在属性 'forEach'部分代码:字符串;数量:数量;修改数量:数量;到期日:任何;重新...'。

我不确定我还应该做什么。 理想情况下,我想在订阅之前映射过滤器和减少,并仅使用订阅将最终输出分配给变量。也欢迎任何实现这一目标的建议。

【问题讨论】:

    标签: angular ionic2 rxjs angularfire2


    【解决方案1】:

    val 是一个项目数组,您正在尝试访问数组中项目的属性。您正在寻找console.log(val[0].partprice)val.forEach(item => console.log(item.partPrice))

    【讨论】:

    • 我不能使用 val[0].partprice 因为可能有多个。已经尝试过 val.forEach(item => console.log(item.partPrice))。出现错误:类型 '{ partname: string; 上不存在属性 'forEach'部分代码:字符串;数量:数量;修改数量:数量;到期日:任何;重新...'。
    【解决方案2】:

    你可以这样做:

    ...
    .flatMap(order => order)
    .map(order => order.partprice)
    .filter(price => price > 0)
    .reduce((acc, value) => acc + value)
    .subscribe(result => console.log(result))
    

    Observable 必须完成才能使 reduce 工作。 平面映射将数组映射到单个事件,以便它们可以被反应函数处理。

    【讨论】:

    • 这就是我实际开始的方式,但出现错误并转向其他选项。错误:平面地图上的打字稿错误类型“(订单:{零件名称:字符串;零件代码:字符串; ...”不能分配给参数{并且地图上的打字稿错误属性“partprice”在类型“{}”上不存在.
    • analysisProvider.getAllOrders().valueChanges 返回什么类型??它应该类似于: Observable
    • valueChanges() 上的链在中间步骤中返回一个数组。在那之前我分配了一个数组变量,并在需要的阶段使用 map/filter/reduce 处理了数组。这解决了这个问题。感谢您的意见。
    猜你喜欢
    • 2019-11-11
    • 2016-08-08
    • 1970-01-01
    • 1970-01-01
    • 2021-12-14
    • 1970-01-01
    • 1970-01-01
    • 2019-04-20
    • 2020-08-12
    相关资源
    最近更新 更多