【问题标题】:Rxjs loop through nested objectRxjs 循环遍历嵌套对象
【发布时间】:2017-11-22 16:19:27
【问题描述】:

RxJS 如何从嵌套的对象数组中获取特定的属性值

const obj = {
      name: 'campus',
      buildings: [
        {
          name: 'building',
          floors: [
            {
              name: 'floor'
            }
          ]
        }
      ]
    };

有没有办法在 RxJS 中获取名称。基本上我需要输出为 [campus, building, floor]

Observable.of(obj).map((res) => res.name).subscribe((val) => console.log(val));

我知道如何在不使用 RxJS 的情况下做到这一点。但我想知道如何使用 RxJS。 提前致谢

目前我正在做类似下面的事情

const names = [];
    names.push(obj.name);
    obj.buildings.forEach((building) => {
      names.push(building.name);
      building.floors.forEach((floor) => {
        names.push(floor.name);
      });
    });
    console.log(names);

【问题讨论】:

  • 所以您的目标是检查每个对象的“名称”属性并将它们全部放在一个数组中?你能发布没有 rxjs 的情况下你会怎么做吗?
  • “用 RxJS 做这个”有什么好处? RxJS 更适合异步工作而不是同步工作,在我看来这非常同步——你想让它异步吗?
  • @Whymarrh 我想知道在 RxJS 中有没有办法做到这一点,是的,如果有用的话,我想让它异步。
  • 您可能对IxJS 感兴趣,因为它是一种支持异步源的编写方式。也就是说,我不认为在 RxJS 中这样做是有用的,因为这里没有什么不同的。如果您想将此操作的结果“转换”为 Observable 以供其他地方使用,您可以在末尾使用Observable.from(names)
  • 总体而言,反应式文档对于在务实的环境中快速上手没有用处。像这样的问题对于学习响应式编程的实现很有价值。其次,如果反应式编程不是最好的解决方案,那么应该在它和命令式编程之间划清界限——文档(和任何书籍)暗示它是我见过的每个示例中的双面硬币。 @PratapA.K 正在解决我认为的主要障碍。使用响应式,总有上千种方法可以做到,但最终似乎只有 1-3 种方法可以扩展。

标签: angular typescript rxjs rxjs5


【解决方案1】:

这应该有效:

getNames(obj) {
    const names = [];
    names.push(obj.name);
    obj.buildings.forEach((building) => {
      names.push(building.name);
      building.floors.forEach((floor) => {
        names.push(floor.name);
      });
    });
    return names;
}

Observable.of(obj).map((res) => this.getNames(res)).subscribe((val) => console.log(val));

您正在将一个值更改为另一个值,就像这样最简单。没有一种特殊的反应方式可以作用于单个值。响应式方法用于随着时间的推移对值流进行操作,就目前而言,您正在对流中的单个值进行操作,因此最好将其视为一个值,而不是跳过箍来尝试“以响应式方式做事” ”。如果您试图随着时间的推移从一系列对象中收集“名称”属性,那就另当别论了,在这种情况下,您可以使用 reduce 或 scan。

【讨论】:

    猜你喜欢
    • 2017-05-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-05-04
    • 2013-05-06
    • 1970-01-01
    相关资源
    最近更新 更多