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

时间:2015-02-27 10:05:38

标签: javascript arrays dictionary

我想知道使用javascripts本机数组方法(map,reduce等)来解决这个问题的最佳方法。

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

示例案例:

我有一个数组,其中n个元素类似于“ObjectA”:

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

我想得到另一个“ObjectB”类型的对象数组:

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

所以在这种情况下,如果第一个数组只包含objectA,那么所需的结果将是:

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

我尝试过使用两个嵌套的“map”调用,但回调函数只能返回一个元素。

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方式?

2 个答案:

答案 0 :(得分:1)

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

如果您想要其他长度,可以使用Array.prototype.reduce,然后对每个对象使用Array.prototype.map

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

答案 1 :(得分:0)

您与嵌套地图很接近,但是当您注意到这样做时,您将获得数组中的数组。为了避免使用forEach并将结果推送到内循环中的数组:

var result = [];

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