0

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

当涉及到数组时,我有一个问题,因为我的结果是一个关联数组。我的目标是将[[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/

4

3 回答 3

4

如果你使用jQuery 的mapfunction,你会自动得到数组展平:

该函数可以返回 [...] 一个值数组,该数组将被展平为完整数组

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 函数是最简单的解决方案。

于 2013-05-18T09:02:46.503 回答
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]
于 2013-05-18T09:13:43.230 回答
0

你不能map单独使用,因为那只会返回一个数组或数字数组。但是,您可以使用以下方法将其展平为一个数组concat

var retArr = [].concat.apply([], list.map(function(v) { return v.bar; }));

如果您使用Underscore,您甚至可以将其缩短为

var retArr = _.flatten(_.pluck(list, "bar"), true);
于 2013-05-19T08:13:28.763 回答