有没有办法让Lodash提前终止,以便返回true而不是抛出异常?
_.chain([i => 'a', 0])
.reduce((prev, curr) => prev.concat(curr()), [])
.some(i => i == 'a')
.value()
答案 0 :(得分:1)
我相信实际上我正在考虑错误的问题,如果我想要的答案是.some()的布尔结果,那么这应该是我的最高阶查询。
_.chain([i => 'a', 0])
.some(i => i() == 'a')
.value();
然后它首先评估第一个项目并提前退出。期待Lodash特定答案是无用的。
答案 1 :(得分:0)
首先,您的代码很难阅读,并且不需要使用_.chain。
您的函数会抛出错误,因为您尝试使用curr()调用数组中第二个条目的函数。
你想要在结果中实现的一切都可以在没有lodash的情况下完成。
const values = [i => 'a', 0];
const filtered = values.reduce((prev, curr) => {
if (typeof curr === 'function') {
prev.push(curr());
} else {
prev.push(curr);
}
return prev;
}, []);
const hasSpecificValue = filtered.some(i => i == 'a');
console.log(hasSpecificValue);
这里我添加了一个jsfiddle例如
如果您只想修复代码,请删除0条目或对reduce函数添加单独的检查。可能看起来像这样
_.chain([i => 'a', 0])
.reduce((prev, curr) => prev.concat(typeof curr === 'function' ? curr() : curr), [])
.some(i => i == 'a')
.value()
答案 2 :(得分:0)
答案 3 :(得分:0)
你要求懒惰的评价。
对于lodash wrapper的文档中列出的某些方法,它存在 - 默认情况下,check .some
不可链接。
同样reduce()
无法进行延迟评估,因为reduce()
可能/会/会影响每个步骤的所有结果(或者我错在那一点?)。
_([(i) => 'a', 0])
.map(x=> x())
.filter(x => x === 'a')
.slice(0, 1)
.value()
几乎就像你问的那样工作(除了事实.slice
返回undefined
而不是boolean False,如果没有这样的元素的话)