Javascript 个数组:给定数组[n],得到数组[n*m]

Javascript arrays: Given array[n], get array[n*m]

我想知道哪种方法是使用 javascript 的原生数组方法(map、reduce 等)解决此问题的最佳方法。

给定一个包含 n 个对象的数组,我想创建另一个数组,该数组将为原始数组中的每个元素包含 m 个对象。我可以使用常见的 "for" 循环来迭代数组,但我想知道它是否可以用本机数组方法解决。

示例案例:

我有一个包含 n 个元素的数组 "ObjectA":

var objectA = {
       name: "xxx",
       tels: ["yyy","zzz"]
};

我想获得另一个类型为 "ObjectB" 的对象数组:

var objectB = {
       name: "xxx",
       tel: "yyy"
};

所以在这种情况下,如果第一个数组仅包含对象 A,则所需结果将是:

[
   {
      name: "xxx",
      tel: "yyy"
   },
   {
      name: "xxx",
      tel: "zzz"
   }
]

我试过使用两个嵌套的 "map" 调用,但回调函数只能 return 一个元素。

var array1 = [objectA];

var array2 = array1.map(function(objectA){
   return objectA.tels.map(function(tel){
      return {
                 name : objectA.name,
                 tel : tel
              };
   });
});

在回调中返回另一个数组,生成一个数组数组,这不是我想要的。 Array2 结果:

[
   [
      {
         name: "xxx",
         tel: "yyy"
      },
      {
         name: "xxx",
         tel: "zzz"
      }
   ]
]

我必须使用通用的 for 循环还是有原生的 javascript 方式?

您已经接近嵌套地图了,但是正如您注意到的那样,您将在数组中获得数组。为避免使用 forEach 并将结果推送到内部循环中的数组:

var result = [];

initialArray.forEach(function(item){
   item.tels.forEach(function(tel){
      result.push({
          name : item.name,
          tel : tel
      });
   });
});

Array.prototype.map 无法在此处使用 array1 root,因为它 returns 是一个相同长度的数组,这不是您想要的。

如果你想要另一个长度,你可以使用 Array.prototype.reduce,然后对每个对象 tels 使用 Array.prototype.map

var array2 = array1.reduce(function (prev, curr) {
    return prev.concat(curr.tels.map(function (tel) {
        return {name: curr.name, tel: tel};
    }));
}, []);