【问题标题】:How to merge two properties in Bacon.js如何在 Bacon.js 中合并两个属性
【发布时间】:2015-01-23 00:53:13
【问题描述】:

假设我有两个 Bacon.js 属性。一个是子对象——也许只是他的名字。另一个属性对象与他或她所穿的衣服 - 裤子颜色和衬衫颜色。

在我的例子中,我使用 Angular-Bacon 从 AngularJS 范围变量创建属性。

如何获得将两者合并在一起的属性?我希望我可以执行以下操作(假设我有 Lodash 可用):

var outfit = $scope.$watchCollectionAsProperty('outfit'); // {shirt: 'blue', pants: 'green'}
var child = $scope.$watchCollectionAsProperty('child'); // {name: 'Jimmy'}

var clothedChild = outfit.map(function(it) {
    return _.merge(it, child.value());
});

不过,这行不通。

我是 RFP 的超级新手,正在尝试在 Angular 应用程序中使用 Bacon,但我很难理解它。

任何提示将不胜感激。

【问题讨论】:

    标签: javascript angularjs functional-programming reactive-programming bacon.js


    【解决方案1】:

    答案并不像我想象的那么复杂——我似乎只是不知道要寻找的术语。

    var clothedChild = Bacon.combineWith(function(p1, p2) {
        return _.merge({}, p1, p2);
    }, child, outfit);
    

    【讨论】:

    • 警告!这将修改原始子对象。如果任何其他代码正在侦听子流,它们可能会也可能不会获得合并的子对象。此外,当父流发出新值时,这些值将与已经合并的子对象合并。你可以使用return _.merge({}, p1, p2); 来解决这个问题。
    • @AgentME 非常感谢您的提示。
    • Bacon.combineWith(R.merge, child,outfit) 无需修改任何内容即可完成
    【解决方案2】:

    你也可以这样做

    child.combine(outfit, function(child, outfit){
      return _.merge({}, child, outfit);
    });
    

    这有点短。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-11-16
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多