Javascript 如何在结果中添加下划线但不添加falsy值的映射
我有一个对象数组,我只想在子对象通过条件时保存它。此时,我首先使用Javascript 如何在结果中添加下划线但不添加falsy值的映射,javascript,underscore.js,Javascript,Underscore.js,我有一个对象数组,我只想在子对象通过条件时保存它。此时,我首先使用map,然后使用filter,结果如下: var a = _.filter( _.map(activities.toJSON(), function (activity) { if (activity.verb !== 'test') { return activity.object; } }), function(b){return b;}); 这似乎有点奇怪。有更好的方法吗。你可
map
,然后使用filter
,结果如下:
var a = _.filter(
_.map(activities.toJSON(), function (activity) {
if (activity.verb !== 'test') {
return activity.object;
}
}), function(b){return b;});
这似乎有点奇怪。有更好的方法吗。你可以试试
你可以试试
每当你开始做类似
\uf.g(…)
的事情时,你都应该考虑使用。你可以这样做:
var a = _.chain(activities.toJSON())
.select(function(a) { return a.verb !== 'test' })
.map(function(a) { return a.object })
.value();
我也调整了你的逻辑来简化事情,没有必要做两次相同的测试。如果将函数放入变量中,可以使此类内容非常可读:
var not_tests = function(a) { return a.verb !== 'test' };
var extract_obj = function(a) { return a.object };
var results = _.chain(activities.toJSON())
.select(not_tests)
.map(extract_obj)
.value();
演示:
使用这种方法会有相当多的复制,因此您可能只想走老路,使用一个循环:
var json = activities.toJSON();
var a = [ ];
for(var i = 0; i < json.length; ++i)
if(json[i].verb !== 'test')
a.push(json[i].object);
var json=activities.toJSON();
var a=[];
for(var i=0;i
JavaScript中的循环完全没有问题。每当你开始做类似
\uf(\ug(…)
的事情时,你应该考虑使用。你可以这样做:
var a = _.chain(activities.toJSON())
.select(function(a) { return a.verb !== 'test' })
.map(function(a) { return a.object })
.value();
我也调整了你的逻辑来简化事情,没有必要做两次相同的测试。如果将函数放入变量中,可以使此类内容非常可读:
var not_tests = function(a) { return a.verb !== 'test' };
var extract_obj = function(a) { return a.object };
var results = _.chain(activities.toJSON())
.select(not_tests)
.map(extract_obj)
.value();
演示:
使用这种方法会有相当多的复制,因此您可能只想走老路,使用一个循环:
var json = activities.toJSON();
var a = [ ];
for(var i = 0; i < json.length; ++i)
if(json[i].verb !== 'test')
a.push(json[i].object);
var json=activities.toJSON();
var a=[];
for(var i=0;i
JavaScript中的循环没有任何问题。我想您正在寻找: 另一种方法,我认为在语义上有点好,就是过滤掉你不想要的,然后使用
var a = _.filter(activities.toJSON(), function (activity) {
return activity.verb !== 'test';
}).pluck('object');
我想你在寻找:
另一种方法,我认为在语义上有点好,就是过滤掉你不想要的,然后使用
var a = _.filter(activities.toJSON(), function (activity) {
return activity.verb !== 'test';
}).pluck('object');
对不起,这个不行。在第二次调用reduce函数时,accum为1,因此没有方法push
我没有测试代码。我来看看。这应该有效。在任何情况下,当您返回acum
时,它都应该有效,而不是acum.push
。原因推送返回数组的新长度。但毕竟,似乎一个简单的循环将使每个
循环都相同,而不需要从内部函数返回某些内容。我认为reduce
比创建一个数组然后迭代集合并推送数组要好reduce
一次完成所有操作。抱歉,这不起作用。在第二次调用reduce函数时,accum为1,因此没有方法push
我没有测试代码。我来看看。这应该有效。在任何情况下,当您返回acum
时,它都应该有效,而不是acum.push
。原因推送返回数组的新长度。但毕竟,似乎一个简单的循环将使每个
循环都相同,而不需要从内部函数返回某些内容。我认为reduce
比创建一个数组然后迭代集合并推送数组要好reduce
一次完成这一切。如果使用.chain()
或者我非常喜欢.chain
,这会更好。我通常避免使用.chain()
,除非一行中有>2个下划线调用-否则会同时添加.chain()
和.value()
看起来太臃肿了。使用.chain()
会更好,或者我非常喜欢.chain
。我通常避免使用.chain()
,除非一行中有>2个下划线调用-否则会同时添加.chain()
和.value()
似乎太过臃肿。毕竟,简单的JavaScript解决方案似乎是最清晰的解决方案。@AndreasKöberle:是的,如果逻辑中有更多步骤,或者步骤中使用的函数依赖于其他东西,我可能只会使用下划线(也就是说,有时候你想要not_测试
,有时候你想要not_煎饼
)。毕竟,简单的JavaScript解决方案似乎是最清晰的解决方案。@AndreasKöberle:是的,如果逻辑中有更多的步骤,或者如果步骤中使用的函数依赖于其他东西,我可能只会麻烦使用下划线(也就是说,有时你想要非测试
,有时你想要非煎饼
)。