2016-12-21 4 views
1

Ich versuche, ein Array in einer lodash/Unterstreichungskette zu erstellen, aber es funktioniert nicht.Array in eine Unterstrich/lodash-Kette einfügen

Beispiel:

var foo = _.chain(currentValue) // let's say "1,2,4" 
       .split(',')  // now it is [1,2,4] 
       .max()   // now it is 4 
       .tap(function(maxValue) { 
        return _(Array(maxValue)).fill(false); 
       }) // should be now [false, false, false, false] but doesn't work 
       .value(); 

Was mir fehlt?

+0

Obwohl ich nie lodash verwenden oder was auch immer würde ich versuchen, 'Array (maxValue)' statt '_ (Array (maxValue))'. – Redu

+2

Ich denke, 'tap' macht nichts mit deiner Rückmeldung. Ich denke, es gibt Ihnen nur die Möglichkeit, den Wert zu verändern. Da Strings unveränderbar sind, ist dies wahrscheinlich kein Anwendungsfall für 'tap'. –

+0

Ja, ich habe den Tipp hier falsch verstanden – bdavidxyz

Antwort

2

1) _.tap ist mutieren Argument, es besser ist, _.thru

2) zu nutzen, um Ergebnis, das Sie von Verkettungs muss .value() am Ende der Kette nennen

3) so mein Vorschlag

_.chain('1,2,4') 
    .split(',')  
    .max()   
    .thru(function(maxValue) { 
     return _.chain(maxValue).times(_.constant(false)).value(); 
    }) 
    .value(); 

und wenn wirklich keine Notwendigkeit _.tap oder _.thru

_.chain('1,2,4') 
    .split(',')  
    .max()   
    .times(_.constant(false)) 
    .value(); 
+0

sehr sauber und ausgezeichnete zweite Lösung, danke – bdavidxyz

0

Hier ist pure js Lösung dafür.

var str = "1,2,4"; 
 

 
var result = Array(Math.max.apply(null, str.split(','))).fill(false); 
 
console.log(result)

+0

Sie könnten es sogar kürzer mit dem Spread-Operator machen. – Redu

+0

Es ist mit reinem Javascript weniger lesbar als Lodash-Version. Darüber hinaus kann eine Funktion auf Javascript verzichten, auch wenn dies für das Beispiel nicht der Fall ist. – bdavidxyz

3

können Sie, dass _.times() verwenden und _.fill():

var currentValue = "1,2,4"; 
 

 
var foo = _.chain(currentValue) // let's say "1,2,4" 
 
    .split(',') // now it is ["1","2","4"] 
 
    .max() // now it is "4" 
 
    .times() // [undefined, undefined, undefined, undefined] 
 
    .fill(false) // [false, false, false, false] 
 
    .value(); 
 

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

Und ohne lodash mit ES6 der Array#from:

const str = "1,2,4"; 
 

 
const result = Array.from({ length: Math.max(...str.split(',')) },() => false); 
 

 
console.log(result);