2016-12-23 3 views
1

Вот цепочка lodash, которая вернула упорядоченный, однозначно отсортированный массив целых чисел. Поскольку вход не может быть полностью доверен, есть промежуточная проверка (благодаря методу thru в этом примере). Как этот пример можно изменить, чтобы сломать поток цепи и вернуться?Как избежать или разбить поток цепи в подчеркивании/lodash

_.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>

+1

стоит моих двух пенни является то, что проверка должна осуществляться независимо от преобразования и фильтр действительных данных, т.е. не в цепи. Также afaik вы не можете закорачивать цепочку. –

ответ

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/[email protected](lodash.min.js+lodash.fp.min.js)'></script>

Смежные вопросы