【问题标题】:How to escape or break the chain flow in underscore/lodash如何在下划线/lodash中逃脱或打破链流
【发布时间】:2016-12-23 20:41:11
【问题描述】:

这是一个 lodash 链,它返回一个有序的、唯一排序的整数数组。因为输入不能被完全信任,所以有中间验证(感谢本例中的 thru 方法)。如何更改此示例以打破链流并返回?

_.mixin({
  isIntegerString: function(arg) {
    return /^\d+$/.test(arg);
  }
});

var a = _.chain(" 54,32 ,6 ,32 ") // but param here can be anything so I have to do some checkings
 .thru(function(untrusted) {return _.isString(untrusted) ? untrusted : ''}) // validation !
 .split(',')
 .map(_.trim)
 .thru(function(array1) {return _.every(array1, _.isIntegerString) ? array1 : []}) // validation !
 .map(_.parseInt)
 .sortBy(function(e) {return e;})
 .uniqBy(function(e) {return e;})
 .value();

console.log(a);
<script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.17.2/lodash.js"></script>

【问题讨论】:

  • 我两分钱的价值是验证应该独立于有效数据的转换和过滤器进行,即不在链中。同样,您不能缩短链条。

标签: javascript underscore.js lodash


【解决方案1】:

恐怕您无法使用 _.chain 完成您要求的操作。不过,我建议看看这个有趣的 article 关于 _.chain 和 lodash。

按照文章的方法,当函数的结果为假时,您可以使用函数组合和短路。我不知道 lodash 是否为此提供了内置解决方案,我只是为了好玩而自己做的。当然,这只是解决问题的一种幼稚方法,可以大大改进。

希望对你有帮助。

function checkIsString(untrusted) {
  return _.isString(untrusted) ? untrusted : false;
}

function checkAreAllIntegers(array1) {
  return _.every(function(arg) {
    return /^\d+$/.test(arg);
  })(array1) ? array1 : false;
}

function overEveryFnc() {
  var arrFnc = _.toArray(arguments);
  return function applyNextFncTo(args) {
    var nextFnc = arrFnc.shift(),
      partialRes;

    return nextFnc && (partialRes = nextFnc(args)) ? applyNextFncTo(partialRes) : args;
  };
}

var b = overEveryFnc(
  checkIsString,
  //_.tap(console.log),
  _.split(','),
  _.map(_.trim),
  //_.tap(console.log),
  checkAreAllIntegers,
  _.map(_.parseInt(10)),
  //_.tap(console.log),
  _.sortBy(_.identity),
  _.uniqBy(_.identity))(" 54,32 ,6 ,32 ");

console.log(b);
<script src='https://cdn.jsdelivr.net/g/lodash@4(lodash.min.js+lodash.fp.min.js)'></script>

【讨论】:

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