【发布时间】:2016-03-26 02:05:22
【问题描述】:
我实现了一个 mixin 来用 _.where 添加“或”条件
var arr = [{a:1,b:4}, {a:5}, {a:6}, {a:11}];
_.mixin({
or: function(obj,arr,condition){
return _.chain(arr).where(condition).union(obj).value();
}
});
现在我可以像这样使用它了,它的工作原理有点像 sql 查询
_.chain(arr).where({a:1}).or(arr,{a:11,b:3}).or(arr,{a:2}).value();
//returns [{a:1,b:4}]
_.chain(arr).where({a:1}).or(arr,{a:11}).or(arr,{a:2}).value();
//returns [{a:1,b:4},{a:11}]
_.chain(arr).where({a:1}).or(arr,{a:11}).or(arr,{b:4}).value();
//returns [{"a":1,"b":4},{"a":11}] --no duplicates
但我想找到一种更好的方法来调用 _.or({a:1}),现在我必须每次都通过 arr _.or(arr,{a:1}),作为链式“或" 获取第一个对象作为先前执行的函数的结果。
有没有办法在链式 mixin 函数中获取整个数组?
我希望下面返回与我上面的实现相同的结果。 (就像一个完美的 sql 查询)
_.chain(arr).where({a:1}).or({a:11,b:3}).or({a:2}).value();//returns [{a:1,b:4}]
我的主要重点是通过下划线来获得它,但实际上任何其他方式,如 lodash 甚至其他一些库或解决方案也可以。此外,我们不需要使用链接,我也在尝试使用 compose,但到目前为止还没有运气。我想要一个在最少行中完美运行的解决方案。鼓励任何其他改进它的建议。
【问题讨论】:
-
我不认为扩展下划线是正确的方法。请参阅:您必须在结果中传递初始数组的引用,以便每个
or()能够添加更多从初始集合过滤的后续结果。 Underscore 的链接不是为此而设计的。你可以“弯曲”它,但代价是你想要的短。自己实现一个流畅的界面并不像你想象的那么难——这样做可以吗?如果是这样,请编辑您的问题并删除下划线要求(留下您的示例以显示您尝试过的内容)。 -
well underscore 和 lodash 都允许您通过 mixin 使用您的自定义代码来扩展功能,您是对的,链接不是为此而设计的,我对任何其他概念或机制持开放态度。让我更新我的问题以删除下划线和链式依赖项。
-
好的,我更新了这个问题,让它对所有可能的解决方案开放。
-
由于您尝试与链的当前实现“冲突”,您是否尝试过覆盖链本身以始终将根作为最后一个参数传递?
-
还没有,我实际上不想覆盖链,因为我不确定它会在应用程序的其他部分中断什么。我可以只为这个实例覆盖链吗?
标签: javascript underscore.js lodash