Array/Hash 使用 RXJS 的操作

Array/Hash manipulations with RXJS

由于我对 Observables 和 RXJS 很陌生,所以我想问一个问题: 模拟 Hash/Array 操作的最佳方法是什么,例如在 Hash/Array 中添加和删除项目?

我有以下代码片段可以按预期工作,但可能不遵循 Observable "way":

var newMessage = new Rx.Subject(),
  removeMessage = new Rx.Subject(),
  sortMessages = new Rx.Subject(),
  messages = Rx.Observable.merge(
    newMessage.map(function(x) {
      return {
        action: 'add',
        value: x
      };
    }),
    removeMessage.map(function(x) {
      return {
        action: 'remove',
        value: x
      };
    }),
    sortMessages.map(function(x) {
      return {
        action: 'sort',
        value: true
      };
    })
  )
  .scan(function(acc, operation) {
    switch (operation.action) {
      case 'add':
        acc.push(operation.value);
        break;
      case 'remove':
        var removeIndex = acc.indexOf(operation.value);
        if (removeIndex !== -1) {
          acc.splice(removeIndex, 1);
        }
        break;
      case 'sort':
        acc.sort(function(a, b) {
          return a > b;
        });
        break;
    }
    return acc;
  }, []);

var subscription = messages.subscribe(
  function(x) {
    console.log('next ' + x);
  },
  function(err) {
    console.log('Error: %s', err);
  },
  function() {
    console.log('Completed');
  });

newMessage.onNext(4);
newMessage.onNext(2);
newMessage.onNext(1);
removeMessage.onNext(2);
removeMessage.onNext(1);
newMessage.onNext(3);
sortMessages.onNext(true);
<script src="https://cdnjs.cloudflare.com/ajax/libs/rxjs/4.0.1/rx.all.js"></script>

我希望能够通过各种主题推送任意类型的通知(添加、删除、排序、查找)并检索最终结果,这是我已经提交的所有过去指令的总和(没有流从头开始执行所有指令,这是糟糕的性能)。

使用数组和散列的经典方法似乎更简单,但是 Observables 必须有一个合适的方法,不是吗?

好的,我发现了这个 Angular2-rxjs-chat 演示,它以一种非常优雅的方式完全满足了我的需求。

简而言之,他们使用动作或操作流(插入、标记等),每个动作或操作都是一个主题,在扫描 Observable 中调用并改变列表的最后状态。

这是以最扁平和通用的方式完成的。 干得好!