web-dev-qa-db-fra.com

comment ne rien renvoyer (tableau vide) avec la fonction array.map

À l'heure actuelle, si «Tout» dans la liste est détecté, la sortie devient [""].
Production attendue: []

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

Utilisez Array.prototype.filter:

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

Si vous pouvez utiliser ES6, vous pouvez utiliser le générateur pour cela:

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

Si non ... vous pouvez toujours aller de manière impérative:

Copy.names = []

for (var x of rule.names) {
   if (x.name ==='Everything') {                                   
        // do nothing
   } else {
        Copy.names.Push(x.name);
   }
}
2
GingerPlusPlus

Si vous pouvez utiliser Lodash (ce que je recommande vivement), vous pouvez le traiter de manière élégante en utilisant _.flatMap:

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

Comme vous pouvez le constater, cela ressemble à map, sauf que vous retournez un tableau d’éléments au lieu d’élément.

0
GingerPlusPlus

Une autre solution avec Array.filter ():

names.map(
  (x) => x.name === 'Everything' && x.name
).filter(Boolean)
0
Egor Belov