javascript - example - Función Underscore.js_.map: omite un valor
underscore js cdn (7)
Aquí hay otra manera. Este hace uso de la función de composición en el guión bajo. ¿Por qué componer? Compose está respaldado por la teoría de la categoría en matemáticas. De esta manera también es libre de puntos.
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]
Estoy tratando de usar la función underscore.js _.map
en una matriz de objetos, para obtener una matriz con una propiedad de cada objeto. Ese es el escenario habitual, entonces:
var finalArray = _.map(myArray, function(obj) {
return obj.myProperty;
});
Pero en algunos casos necesito que no se agregue nada en la matriz. Podría ser algo como:
var finalArray = _.map(myArray, function(obj) {
if (!obj.ignore) {
return obj.myProperty;
}
});
El resultado de esto es que se inserta un valor undefined
en la matriz, que no es lo mismo que no empujar nada en absoluto.
¿Hay una manera para que la función de mapa no presione un valor, o necesito postprocesar mi finalArray
para eliminar los undefined
no deseados?
Esto se puede hacer usando solo métodos de subrayado, estilo sin puntos :
var finalArray = _.chain(myArray)
.reject(''ignore'')
.pluck(''myProperty'')
.value();
Podrías usar reducir:
myArray.reduce(function (acc, obj) {
if (!obj.ignore) {
acc.push(obj.myProperty);
}
return acc;
}, []);
o con lodash:
_.reduce(myArray, function (acc, obj) {
if (!obj.ignore) {
acc.push(obj.myProperty);
}
return acc;
}, []);
Trate de usar el compact()
de lodash compact()
. Crea una matriz con todos los valores de falsey eliminados. Por lo tanto, los valores false
, null
, 0
, ""
, undefined
y NaN
se eliminan.
https://lodash.com/docs#compact
Lo estoy usando, está muy limpio.
debe usar _.filter () antes de _.map ()
var filteredArray = _.filter(myArray,function(obj) {
return !obj.ignore;
});
var finalArray = _.map(filteredArray, function(obj) {
return obj.myProperty;
});
.map
asignará un nuevo valor a la matriz, puede usar .filter
para filtrar la matriz. Para tu información, puedes usar .pluck
para asignar una propiedad desde un objeto:
_.chain(myArray).filter(function(obj) { return !obj.ignore; }).pluck(''myProperty'').value();
También puedes usar .where
como este:
_.chain(myArray).where({ignore: false}).pluck(''myProperty'').value();
O:
_.pluck(_.where(myArray, {ignore: false}), ''myProperty'');
Entonces, esto significa que quieres filtrar, luego mapea tu matriz.
Para hacer esto en forma de underscore
, deberá pasar su matriz a esta canalización:
myArray -> filtro -> mapa -> finalArray
var isIncluded = function(obj){
return !obj.ignore
}
var takeProperty = function(obj){
return obj.myProperty
}
var finalArray = _.map( _.filter(myArray, isIncluded), takeProperty );