2016-07-26 6 views
1

Hier ist mein Falllodash, erhalten matched Element-Index?

var myArray = [undefined, true, false, true]; 

ich die Einzelteile Index erhalten möchten, der Wert wahr ist. Bei obigem Array sollte das Ergebnis

als das 2. und 4. Element gleich wahr sein. Wie kann ich den Index der übereinstimmenden Artikel mit lodash finden?

Dank

+0

'[... myArray.entries()]. ​​Filter (([, v]) => v) .map (([i]) => i);' – zerkms

Antwort

2

Im Folgenden ist der erste Weg, die Vanille JS kam mit Verstand:

var myArray = [undefined, true, false, true]; 
 

 
var result = myArray.map((v,i) => v ? i : -1).filter(v => v > -1); 
 

 
console.log(result);

Oder wenn Sie nicht wollen, Pfeil Funktionen verwenden:

var result = myArray.map(function(v,i) { return v ? i : -1; }) 
        .filter(function(v) { return v > -1; }); 

Das heißt, zunächst die oder zuordnen iginal-Array, um den Index der wahren Elemente und -1 für andere Elemente auszugeben, dann filtere dieses Ergebnis, um nur diejenigen zu behalten, die nicht -1 sind.

Beachten Sie, dass die Kartenfunktion (v,i) => v ? i : -1 auf truthy Elemente testet - wenn Sie nur Elemente benötigen, die die boolesche true sind, dann verwenden Sie (v,i) => v===true ? i : -1.

Ich denke, das Lodash Äquivalent davon sein würde wie folgt (edit: danke für deutlich verbesserte Syntax zerkms):

var myArray = [undefined, true, false, true]; 
 

 
var result = _(myArray).map((v,i) => v ? i : -1).filter(v => v > -1).value(); 
 

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

+2

Btw '_ (myArray) .map (...). Filter (...). Value()' – zerkms

+0

@zerkms - Entschuldigung, zur gleichen Zeit redigieren Sie Ihren Beitrag, ich habe nicht versucht, Ihren Fehler rückgängig zu machen bearbeiten. Obwohl ich nach dem versehentlichen Rückgängigmachen der Bearbeitung bemerkt habe, dass es scheint, das gleiche Ergebnis ohne den '.value()' Teil zu produzieren - warum ist das? – nnnnnn

+0

Es ist ein SO-Konsolen-Emulator, der einige zusätzliche Magie macht. Wenn Sie zu einer normalen Browser-Konsole gehen, würden Sie sehen, dass es einen Zwischen-lodash-Wrapper zurückgibt. – zerkms

2

Eine andere Möglichkeit:

// lodash 

x = _(myArray).map(Array).filter(0).map(1).value() 

// vanilla 

x = myArray.map(Array).filter(a => a[0]).map(a => a[1]) 
+0

Das ist pädagogisch danke! Ich dachte nie, lodash # filter und lodash # map auf diese Weise zu verwenden. Ich dachte, sie würden nur an Objekt-Matches arbeiten. – ryeballar

1
// lodash 
var myArray = [undefined, true, false, true]; 
var indexes = _.reduce(myArray, (result, val, index) => { 
    if (val) { 
     result.push(index); 
    } 
    return result; 
}, []);