我正在尝试将值映射到新数组。问题是我映射的属性可以是数字或数组。
在数组方面我遇到了问题,因为我的结果是一个关联数组。我的目标是将[[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]
答案 0 :(得分:4)
如果您使用jQuery's map
function,则会自动进行阵列展平:
该函数可以返回一个值数组,这些值将被展平为完整数组
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函数是最简单的解决方案。
答案 1 :(得分:2)
如果没有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]
答案 2 :(得分:0)
您不能单独使用map
,因为这只会返回一个数组或数字数组。但是,您可以使用concat
:
var retArr = [].concat.apply([], list.map(function(v) { return v.bar; }));
如果你使用Underscore,你甚至可以将其缩短为
var retArr = _.flatten(_.pluck(list, "bar"), true);