Lodash如何短路终止

时间:2018-03-07 14:55:41

标签: javascript arrays lodash

有没有办法让Lodash提前终止,以便返回true而不是抛出异常?

_.chain([i => 'a', 0])
.reduce((prev, curr) => prev.concat(curr()), [])
.some(i => i == 'a')
.value()

4 个答案:

答案 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例如

Maven

如果您只想修复代码,请删除0条目或对reduce函数添加单独的检查。可能看起来像这样

_.chain([i => 'a', 0])
.reduce((prev, curr) => prev.concat(typeof curr === 'function' ? curr() : curr), [])
.some(i => i == 'a')
.value()

答案 2 :(得分:0)

是的,请使用transform代替reduce

  

Iteratee函数可以通过显式返回false来提前退出迭代。

https://lodash.com/docs/4.17.5#transform

答案 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,如果没有这样的元素的话)