[英]Foreach inside array.map()
我正在尝试将值映射到新数组。 问题是我要映射的属性可以是数字或数组。
当涉及数组时,我遇到了问题,因为我的结果是关联数组。 我的目标是将[[1,2,3], [1,2,3]]
(见下文)转到[1,2,3,1,2,3]
。 换一种说法; 只要使其成为一维数组即可。
我尝试了map()中的foreach循环,但没有成功。 有任何想法吗?
var list = [{ foo: 1, bar: [1,2,3] }, { foo: 2, bar: [1,2,3] }];
var retArr = list.map(function (v) {
return v.bar;
});
console.log(retArr); // [[1,2,3], [1,2,3]]
var list = [{ foo: 1, bar: [1,2,3] }, { foo: 2, bar: [1,2,3] }];
var retArr = list.map(function (v) {
if($.isArray(v.bar)){
$.each(v.bar, function(i, v){
return v;
});
} else {
return v.bar;
}
});
console.log(retArr); // [undefined, undefined]
如果使用jQuery的map
函数 ,则会自动使数组变平:
该函数可以返回一个值数组,这些值将被展平为整个数组
var retArr = $.map(list, function (v) {
return v.bar;
});
在第二个示例中,由于未从回调返回值,因此得到[undefined, undefined]
作为结果。 $.each
回调的返回值对.map
回调的返回值没有影响。
.map
在这里不会对您有帮助,因为您只能从回调中返回一个值。 相反,您可以仅遍历数组:
var retArr = [];
list.forEach(function (v) {
if ($.isArray(v.bar)) {
retArray.push.apply(retArray, v.bar);
}
else {
retArray.push(v.bar);
}
});
另外,您可以使用Array#reduce
。 但是由于无论如何都在使用jQuery,因此使用它的map函数是最简单的解决方案。
没有JQuery,您还可以使用Array.reduce
展平:
var list = [{ foo: 1, bar: [1,2,3] }, { foo: 2, bar: [1,2,3] }]
,retArr = list.reduce(function (a,b) {
return a.concat(b.bar);
},[]
);
//=> retArr = [1,2,3,1,2,3]
您不能单独使用map
,因为那只会返回一个数组数组或数字。 但是,您可以使用concat
将其展平为一个数组:
var retArr = [].concat.apply([], list.map(function(v) { return v.bar; }));
如果您使用Underscore ,甚至可以将其缩短为
var retArr = _.flatten(_.pluck(list, "bar"), true);
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.