Javascript Foreach-inside-array.map()

Javascript Foreach-inside-array.map(),javascript,jquery,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 (

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

对于数组,我有一个问题,因为我的结果是一个关联数组。我的目标是将
[[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]]

如果使用,将自动获得阵列展平:

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


在第二个示例中,由于没有从回调返回值,因此得到了
[undefined,undefined]
$的返回值。每个
回调对
.map
回调的返回值没有影响

.map
在这里对您没有帮助,因为您只能从回调返回一个值。相反,您可以在数组上迭代:

var retArr = [];

list.forEach(function (v) {
    if ($.isArray(v.bar)) {
        retArray.push.apply(retArray, v.bar);
    } 
    else {
        retArray.push(v.bar);
    }
});
或者,您可以使用。但是,由于您使用的是jQuery,因此使用其映射功能是最简单的解决方案。

如果您使用,您将自动获得阵列展平:

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


在第二个示例中,由于没有从回调返回值,因此得到了
[undefined,undefined]
$的返回值。每个
回调对
.map
回调的返回值没有影响

.map
在这里对您没有帮助,因为您只能从回调返回一个值。相反,您可以在数组上迭代:

var retArr = [];

list.forEach(function (v) {
    if ($.isArray(v.bar)) {
        retArray.push.apply(retArray, v.bar);
    } 
    else {
        retArray.push(v.bar);
    }
});

或者,您可以使用。但由于您使用的是jQuery,使用其映射功能是最简单的解决方案。

没有jQuery,您也可以使用
数组进行展平。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]

在没有JQuery的情况下,您也可以使用
数组展平。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
,因为那样只会返回数组或数字数组。但是,您可以使用以下方法将其展平为一个阵列:

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

var retArr = _.flatten(_.pluck(list, "bar"), true);

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

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

var retArr = _.flatten(_.pluck(list, "bar"), true);

我不知道这叫“扁平化”。如果我找到了,我可能会找到它:-)谢谢,我不知道它叫“扁平化”。如果我这样做了,我可能会找到它:-)谢谢在您的第一个示例中,map的返回值从未使用过,因此您应该用forEach替换map,forEach的作用相同,但不返回任何内容。您还可以删除“return v;”。在第二个示例中,将全局变量retArr设置为[],然后调用map。如果可能的话,应该避免使用全局变量。@SpiderPig:你说得有一部分是对的。将答案更改为使用
数组。reduce
,这为OP提供了一个一行。在您的第一个示例中,map的返回值从未使用过,因此您应该将map替换为forEach,forEach执行相同的操作,但不返回任何内容。您还可以删除“return v;”。在第二个示例中,将全局变量retArr设置为[],然后调用map。如果可能的话,应该避免使用全局变量。@SpiderPig:你说得有一部分是对的。将答案更改为使用
Array.reduce
,这为OP提供了一个单行程序。