Foreach里面的array.map()

时间:2013-05-18 08:57:48

标签: javascript jquery

我正在尝试将值映射到新数组。问题是我映射的属性可以是数字或数组。

在数组方面我遇到了问题,因为我的结果是一个关联数组。我的目标是将[[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] 

http://jsfiddle.net/Mck7N/

3 个答案:

答案 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);