2016-06-27 5 views
4

Wenn jetzt 'Alles' in der Liste erkannt wird, wird die Ausgabe [""].
Erwartete Ausgabe: []wie man nichts zurückgibt (leeres Array) mit array.map Funktion

Copy.names = rule.names.map(function(x) {         
    if (x.name ==='Everything') {         
     return ''; 
    } else { 
     return x.name; 
    } 
}); 
+0

nur schreiben 'zurückkehren;' Auch Verwenden Sie dazu Array.prototype.filter. – theWanderer4865

+0

Wenn ich das tue, gibt es 'Null' zurück, was ich nicht will – Angular

+2

Sie wollen wahrscheinlich eine Methode wie 'Filter' verwenden. 'map' gibt ein Element für jedes Element zurück, über das Sie iterieren. – dyagmin

Antwort

5

Verwendung Array.prototype.filter:

Copy.names = rule.names.filter(function(x) {         
    return x.name !=='Everything'; 
}).map(function (x) { 
    return x.name; 
}); 
+0

Ich tat dies, es ist tatsächlich zurück ' Alles, was falsch ist – Angular

+0

Wenn Sie den Code in Ihrem ursprünglichen Beitrag verwenden, ist das Problem, dass Array.prototype.map eine Transformation auf jedes Element in Ihrer Liste anwendet. Sie müssen stattdessen eine Logik verwenden, um Elemente zu entfernen oder zu ignorieren, die Sie nicht möchten. Array.prototype.map hat nicht die Fähigkeit, Elemente allein zu ignorieren, daher muss es mit einer anderen Funktion wie Array.prototype.filter: https://developer.mozilla.org/en-US/docs/Web kombiniert werden/JavaScript/Referenz/Global_Objects/Array/Filter – Dylon

+1

Sollte es nicht 'x.name! == 'Alles' sein? – GingerPlusPlus

0

Wenn Sie Lodash verwenden können (was ich sehr empfehlen), können Sie mit ihm in eleganter Art und Weise umgehen, indem Sie :

Copy.names = _.flatMap(rule.names, function(x) { 
    if (x.name ==='Everything') {         
     return []; 
    } else { 
     return [x.name]; 
    } 
}) 

Wie Sie sehen können, ist es ähnlich zu map, mit der Ausnahme, dass Sie Array von Elementen statt Punkt zurückzukehren.

+1

Eine Einschränkung dieses Ansatzes besteht darin, dass Sie für jedes Element in rule.names ein temporäres Array erstellen. Dies ist keine große Sache für nur ein paar Elemente, kann aber mit großen Listen teuer werden. – Dylon

1

Wenn Sie ES6 verwenden können, können Sie Generator dafür verwenden:

Copy.names = Array.from(function*() { 
    for (var x of rule.names) { 
     if (x.name ==='Everything') {         
      // do nothing 
     } else { 
      yield x.name; 
     } 
    } 
}) 

Wenn nicht ... Sie können immer für unerlässlich Weg gehen:

Copy.names = [] 

for (var x of rule.names) { 
    if (x.name ==='Everything') {         
     // do nothing 
    } else { 
     Copy.names.push(x.name); 
    } 
} 
+0

Ich glaube nicht, dass der erste Ansatz (mit Array.from mit Generator) funktioniert. Ich habe es in verschiedenen ES6-fähigen Umgebungen versucht und es gibt immer ein leeres Array zurück. – Chris

Verwandte Themen