【问题标题】:sortBy condition using callback function generated by underscore / lodashsortBy 条件使用下划线/lodash 生成的回调函数
【发布时间】:2013-08-20 12:59:09
【问题描述】:

我有一个这样的 javascript 模型:

var scope = {
  entries : [ 
      { label : 'one', value : 'first entry'}, 
      { label : 'two', value : 'second entry'}, 
      { label : 'a', value : 'x'}
  ],
  order : 'label'; // may also contain 'value'
}

现在我想根据 order 的值对条目进行排序并缓存它。

我知道使用闭包的方式:

_.memoize( 
    function() {
        return _.sortBy( scope.entries, scope.order);
    }, 
    _.partial( _.result, scope, 'order')
)

是否可以将调用 _.sortBy 的闭包替换为类似于第二个参数(由 _.partial 生成的函数)之类的东西?

要明确:我想要的是一种声明“排序顺序”内容而不将其包装在函数中的方法。所以它看起来像:

_.memoize( 
        // line below doesnt work, just to clarify what i want :-)
    _.sortBy( scope.entries, _.result( scope, 'order')), 

    _.partial( _.result, scope, 'order')
)

【问题讨论】:

    标签: underscore.js lodash


    【解决方案1】:

    好吧,_.memoize 需要一个函数来记忆,所以不,你不能用对你试图记忆的函数的调用来替换第一个参数。您的代码似乎是半最优的。另一方面,使用_.result 来获取属性值似乎很奇怪,我想你可以使用_.partial 并避免写function;确定这会起作用,但可能有点令人困惑,所以为什么不在那里也使用一个函数呢?为scope 参数化它,你会有

    _.memoize( 
        function(scope) {return _.sortBy(scope.entries, scope.order);},
        function(scope) {return scope.order;}
    );
    

    对我来说似乎很干净。

    【讨论】:

    • 我想知道是否有一种更具声明性的方式,而无需编写我自己的闭包。我知道它是如何与闭包一起工作的,但我想知道它是否可以在不写闭包的情况下进行。就像它在使用 github.com/dtinth/it.js 时的工作方式一样(但没有它:-)
    • @Igersman,正如我想说的,这不可能。考虑如何在某些情况下使用_.bind_.partial 或其他任何东西来替代将回调编写为无处不在的小函数确实很有趣,但是当涉及的逻辑很少时,这更合适;在这种情况下,您将检索两个属性以传递给_.sortBy。如果你真的想使用_.bind_.partial 或其他什么,你可以使用一些辅助函数和Function.prototype.apply.bind(Function.prototype.call,... 或类似的,但有什么意义呢?
    • 您提出的正是“重点”:一种表达函数(范围){return _.sortBy(scope.entries, scope.order);}而不写闭包(即functrion( ) { ... }) 手动。闭包应该由 lodash 生成。如果 lodash 可能的话,这只是一个技术问题。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-03-29
    相关资源
    最近更新 更多