2016-12-23 4 views
1

順序付けされた、一意にソートされた整数の配列を返したロダッシュチェーンです。入力を完全に信頼することはできないため、中間の検証が行われます(この例では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>

+1

私の2ペニーの価値は、検証が独立して変換して、有効なデータのフィルタ、すなわちないチェーンでの行われるべきであるということです。あなたもチェーンをショートカットすることはできません。 –

答えて

1

私はあなたが_.chain使用のために求めているものを行うことはできません怖いです。それにもかかわらず、私は_chainとlodashについてこの興味深いarticleを見てみることをお勧めします。

この記事のアプローチに従えば、関数の結果がfalseのときに関数の構成と短絡を使用できます。私はロダッシュがこれに組み込まれた解決策を提供しているかどうか分かりません。もちろん、それは問題への単純なアプローチであり、大幅に改善することができます。

希望します。

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>

関連する問題