【问题标题】:Javascript arrays: Given array[n], get array[n*m]Javascript数组:给定数组[n],得到数组[n*m]
【发布时间】:2015-02-27 18:45:46
【问题描述】:

我想知道使用 javascript 原生数组方法(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 方式?

【问题讨论】:

    标签: javascript arrays dictionary


    【解决方案1】:

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

    如果你想要另一个长度,你可以使用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};
        }));
    }, []);
    

    【讨论】:

    • 哇,我没有意识到 reduce 可以使用数组作为初始值而不是原始值。谢谢!!
    • 是的,reduce 是一个强大的工具,但有时有更简单的方法可以实现您想要的。
    【解决方案2】:

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

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

    【讨论】:

    • 这是一个很好的解决方案,但我更喜欢 @aduch 的方法,它更像是更多的极客...... XD 无论如何,谢谢!
    猜你喜欢
    • 2016-07-02
    • 2020-03-28
    • 1970-01-01
    • 1970-01-01
    • 2014-09-04
    • 2020-01-14
    • 1970-01-01
    • 1970-01-01
    • 2016-09-01
    相关资源
    最近更新 更多