web-dev-qa-db-fra.com

Underscore.js Fonction _.map: ignorer une valeur

J'essaie d'utiliser la fonction underscore.js _.map sur un tableau d'objets, pour obtenir un tableau avec une propriété de chaque objet. C'est le scénario habituel, donc:

var finalArray = _.map(myArray, function(obj) {
    return obj.myProperty;
});

Mais dans certains cas, je n’ai besoin que rien soit ajouté au tableau. Cela pourrait être quelque chose comme:

var finalArray = _.map(myArray, function(obj) {
    if (!obj.ignore) {
        return obj.myProperty;
    }
});

Il en résulte qu'une valeur undefined est poussée dans le tableau, ce qui n’est pas la même chose que de ne rien pousser du tout.

Existe-t-il un moyen pour la fonction de mappage de ne pas transmettre de valeur, ou dois-je post-traiter mon finalArray pour supprimer les indésirables undefined '?

26
foucdeg

vous devriez utiliser _.filter () avant _.map ()

var filteredArray = _.filter(myArray,function(obj) {
     return !obj.ignore;
});

var finalArray = _.map(filteredArray, function(obj) {
    return obj.myProperty;
});
27
couettos

Vous pourriez utiliser réduire:

myArray.reduce(function (acc, obj) {
    if (!obj.ignore) {
        acc.Push(obj.myProperty);
    }
    return acc;
}, []);

ou avec lodash:

_.reduce(myArray, function (acc, obj) {
  if (!obj.ignore) {
    acc.Push(obj.myProperty);
  }
  return acc;
}, []);
22
Thomas Eschemann

Cela peut être fait en utilisant uniquement les méthodes de soulignement, style sans points :

var finalArray = _.chain(myArray)
    .reject('ignore')
    .pluck('myProperty')
    .value();
12
Pavlo

.map va mapper une nouvelle valeur sur le tableau, vous pouvez utiliser .filter pour filtrer le tableau. Pour votre information, vous pouvez utiliser .pluck pour mapper une propriété à partir d'un objet:

_.chain(myArray).filter(function(obj) { return !obj.ignore; }).pluck('myProperty').value();

Vous pouvez également utiliser .where comme ceci:

_.chain(myArray).where({ignore: false}).pluck('myProperty').value();

Ou:

_.pluck(_.where(myArray, {ignore: false}), 'myProperty');
5
andlrc

Essayez d'utiliser compact() de lodash. Il crée un tableau avec toutes les valeurs de Falsey supprimées. Les valeurs false, null, 0, "", undefined et NaN sont supprimées.

https://lodash.com/docs#compact

Je l'utilise - c'est très propre.

2
Michael R

Cela signifie donc que vous voulez filtrer, puis mapper votre tableau.

Pour faire ceci de manière underscore, vous devrez passer votre tableau dans ce pipeline:

myArray -> filtre -> carte -> finalArray 

var isIncluded = function(obj){
    return !obj.ignore
}
var takeProperty = function(obj){
    return obj.myProperty
}
var finalArray = _.map( _.filter(myArray, isIncluded), takeProperty  );
1
TaoPR

Voici un autre moyen. Celui-ci utilise la fonction de composition en soulignement. Pourquoi composer? compose est soutenu par la théorie des catégories en mathématiques. Cette façon est également sans point.

var pluckMyProp = function(array) {
    return _.pluck(array, 'myProperty')
}

var reject = function(array) {
    return _.reject(array, function(element) {
        return element['ignore'] === true
    })
}

var finalArray = _.compose(pluckMyProp, reject)
var data = [{myProperty: 1, ignore: false}, {ignore: true}, {myProperty: 2}]


finalArray(data) //=> [1,2]
0
Kevin Le - Khnle