繁体   English   中英

在array.map()内部的Foreach

[英]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] 

http://jsfiddle.net/Mck7N/

如果使用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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM