我试图在对象数组上使用underscore.js _.map
函数,以获取具有每个对象属性的数组。这是通常的情况,所以:
var finalArray = _.map(myArray, function(obj) {
return obj.myProperty;
});
但在某些情况下,我需要在数组中添加 nothing 。它可能是这样的:
var finalArray = _.map(myArray, function(obj) {
if (!obj.ignore) {
return obj.myProperty;
}
});
这样做的结果是undefined
值被推入数组中,这与不推送任何内容是不一样的。
地图功能是否有办法不推送值,或者我是否需要对finalArray
进行后期处理以删除不需要的undefined
?
答案 0 :(得分:27)
你应该在_.map()
之前使用_.filter()set pm3d interpolate 4,4
答案 1 :(得分:26)
您可以使用reduce:
myArray.reduce(function (acc, obj) {
if (!obj.ignore) {
acc.push(obj.myProperty);
}
return acc;
}, []);
或与lodash:
_.reduce(myArray, function (acc, obj) {
if (!obj.ignore) {
acc.push(obj.myProperty);
}
return acc;
}, []);
答案 2 :(得分:12)
这可以单独使用Underscore方法完成,points-free style:
cmd.Transaction = transaction;
答案 3 :(得分:5)
.map
会将新值映射到数组,您可以使用.filter
来过滤数组。仅供参考,您可以使用.pluck
来映射对象的属性:
_.chain(myArray).filter(function(obj) { return !obj.ignore; }).pluck('myProperty').value();
你也可以像这样使用.where
:
_.chain(myArray).where({ignore: false}).pluck('myProperty').value();
或者:
_.pluck(_.where(myArray, {ignore: false}), 'myProperty');
答案 4 :(得分:2)
尝试使用lodash的 compact()
。它创建一个删除了所有falsey值的数组。因此,值false
,null
,0
,""
,undefined
和NaN
将被删除。
https://lodash.com/docs#compact
我正在使用它 - 它很干净。
答案 5 :(得分:1)
所以这意味着你要过滤,然后映射你的数组。
要以underscore
的方式执行此操作,您需要将数组传递到此管道中:
myArray - > 过滤器 - > 地图 - > finalArray
var isIncluded = function(obj){
return !obj.ignore
}
var takeProperty = function(obj){
return obj.myProperty
}
var finalArray = _.map( _.filter(myArray, isIncluded), takeProperty );
答案 6 :(得分:0)
这是另一种方式。这个使用下划线中的compose函数。为什么要撰写? compose由数学中的类别理论支持。这种方式也是无点的。
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]