【问题标题】:Merging (zipping) two arrays of different length with map() in JavaScript在 JavaScript 中用 map() 合并(压缩)两个不同长度的数组
【发布时间】:2019-09-21 23:29:15
【问题描述】:

我正试图围绕 map() 方法,在这种情况下使用它来组合(压缩)两个不同长度的数组。我已经检查过之前关于 JavaScript 压缩的问题,但它们主要关注的是等长数组。

我有两个数组:

const countries = ['US', 'FR', 'IT']
const area = [100, 105, 110, 115, 120, 125, 130]

let merge = countries.map(function (c) {
    area.map(function (a) {
        return c + a
    // This returns an array of length 3 (prints country + all areas into one array position)
    // However if I create a third array and use push(c + a) here instead then length is 21 (which is what I am trying to achieve). 
    })
})

我是否返回了错误的值?就像我在评论中写的那样,如果我将 (c+a) 打印或推送到另一个数组中,那么我会得到所有 21 种可能的组合。 map() 的重点是获得一个新数组,所以我不想推入第三个数组。我还听说嵌套的 forEach 循环是不好的做法(如果我要这样做的话)。

【问题讨论】:

    标签: javascript arrays dictionary zip


    【解决方案1】:

    .map 必然会创建一个与被迭代的数组长度相同的新数组。因为countries 有 3 个项目,所以如果您使用 countries.map,您的输出也将有 3 个项目(一个数组数组)。

    在这里使用.map 将不起作用,因为您的输入数组的长度都与所需的输出数组的长度不同。 .push 到外部变量,就像你已经知道的那样,或者使用 .reduce 并推送到累加器:

    const countries = ['US', 'FR', 'IT']
    const area = [100, 105, 110, 115, 120, 125, 130]
    
    const merged = countries.reduce((merged, c) => {
      area.forEach((a) => {
        merged.push(c + a);
      });
      return merged;
    }, []);
    console.log(merged);

    从长度为 7 和 3 的数组创建一个长度为 21 的数组的算法必然涉及嵌套循环 - 这没有什么问题。

    【讨论】:

      【解决方案2】:

      您的代码很好,您唯一需要在映射后对数组进行flatten 操作,因为内部映射将返回一个数组,而您需要一个数组包含所有值,因此您只需要展平数组。 flat MDN

      const countries = ['US', 'FR', 'IT']
      const area = [100, 105, 110, 115, 120, 125, 130]
      
      let merge = countries.map(function (c) {
          return area.map(function (a) {
              return c + a
          })
      }).flat()
      
      console.log(merge)

      另一种方法是使用flatMap

      const countries = ['US', 'FR', 'IT']
      const area = [100, 105, 110, 115, 120, 125, 130]
      
      let merge = countries.flatMap((c, i) => area.map(a => c + a))
      
      console.log(merge)

      【讨论】:

        【解决方案3】:

        我想你想要更多这样的东西:

        const countries = ['US', 'FR', 'IT'];
        const area = [100, 105, 110, 115, 120, 125, 130];
        let merge = countries.map(x => [x, area]);
        console.log(merge);
        

        你应该得到

        Array [Array ["US", Array [100, 105, 110, 115, 120, 125, 130]], Array ["FR", Array [100, 105, 110, 115, 120, 125, 130]], Array ["IT", Array [100, 105, 110, 115, 120, 125, 130]]]
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2015-05-29
          • 2021-11-19
          • 2019-02-27
          • 2019-07-30
          • 1970-01-01
          • 1970-01-01
          • 2018-09-14
          • 2014-03-27
          相关资源
          最近更新 更多