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
'?
vous devriez utiliser _.filter () avant _.map ()
var filteredArray = _.filter(myArray,function(obj) {
return !obj.ignore;
});
var finalArray = _.map(filteredArray, function(obj) {
return obj.myProperty;
});
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;
}, []);
Cela peut être fait en utilisant uniquement les méthodes de soulignement, style sans points :
var finalArray = _.chain(myArray)
.reject('ignore')
.pluck('myProperty')
.value();
.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');
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.
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 );
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]