【问题标题】:iterate array of arrays and concat in javascript在javascript中迭代数组和concat
【发布时间】:2020-09-07 03:25:05
【问题描述】:

假设我有一个数组 [["a", "b"], ["c", "d"]] 我如何迭代或减少或映射或加入这个数组并获得 ["ac", "ad", "bc", "bd"] 如果数组像 [["a", "b"], ["c", "d"], ["e", "f"]] 我应该像 ["ace", "acf", "ade", "adf", "bce", "bcf", "bde", "bdf"]

我们如何使用数组迭代或方法来实现这一点?

我尝试使用reduce:

const output = [];
const sol = array.reduce((cum, ind) => {
  for (let i = 0; i <= cum.length; i++ ) {
    for (let j = 0; j <= ind.length; j++) {
      output.push(`${cum[i]} + ${ind[j]}`);
    }
  }
});
console.log(output);

但我没有得到确切的输出。

【问题讨论】:

  • 不使用for循环能不能实现
  • 如果你有zip like this,那将是微不足道的:zip(...inputArray).map(x =&gt; x.join())
  • @9000 zip 逻辑在这里不适合,因为它会从每个数组中压缩一次对,它不会生成所有组合,这就是问题所在。

标签: javascript arrays typescript


【解决方案1】:

我会使用递归方法:遍历第一个数组,然后进行递归调用以检索第二个和以后的数组的字符串。递归执行此操作,直到到达数组的末尾。然后,在返回的路上,您可以推送与当前数组的每个元素连接的递归结果:

const recurse = (arr) => {
  const subarr = arr.shift();
  if (!subarr) return;
  const result = [];
  for (const laterStr of recurse(arr) || ['']) {
    for (const char of subarr) {
      result.push(char + laterStr);
    }
  }
  return result;
}

const arr = [["a", "b"], ["c", "d"], ["e", "f"]];
console.log(recurse(arr));

【讨论】:

    【解决方案2】:

    你可以使用 reduce 和 flat

    arr1= [["a", "b"], ["c", "d"]] ;
    arr2=[["a", "b"], ["c", "d"], ["e", "f"]];
    arr3=[["a", "b"], ["c", "d"], ["e", "f"],, ["g", "h"]];
    function calculate(arr) {
      return arr.reduce(function(a, b) {
         return a.map( function(x) { return b.map(function(y) { return x.concat([y])})}).flat().flat()}, [[]]);
    }
    console.log(calculate(arr1)); 
    
    console.log(calculate(arr2));
    
    console.log(calculate(arr3));

    【讨论】:

      【解决方案3】:

      您可以使用一个for 循环和递归来执行此操作,其中您使用一个参数来保持您使用for 循环的当前子数组的索引,并在每个级别上增加该值。这是Cartesian product

      const data = [["a", "b"], ["c", "d"], ["e", "f"]]
      
      function cartesian(data, prev = '', n = 0) {
        const result = []
      
        if (n >= data.length) {
          result.push(prev);
          return result;
        }
      
        for (let i = 0; i < data[i].length; i++) {
          let val = prev + data[n][i];
          result.push(...cartesian(data, val, n + 1))
        }
      
        return result;
      }
      
      console.log(cartesian(data));

      另一种使用reduce 方法的方法,仅当当前n 值小于data.length - 1 时才会创建递归调用。

      const data = [["a", "b"], ["c", "d"], ["e", "f"]]
      
      function cartesian(data, prev = '', n = 0) {
        return data[n].reduce((r, e) => {
          let value = prev + e;
      
          if (n < data.length - 1) {
            r.push(...cartesian(data, value, n + 1))
          }
      
          if (value.length == data.length) {
            r.push(value)
          }
      
          return r;
        }, [])
      }
      
      const result = cartesian(data);
      console.log(result);

      【讨论】:

        【解决方案4】:

        这是iterative 方法。 遍历数组数组,在每个数组上更新输出项。

        const data = [
          ["a", "b"],
          ["c", "d"],
          ["e", "f"]
        ];
        
        let output = [""];
        data.forEach(arr => {
          const temp = [];
          arr.forEach(item => output.forEach(curr => temp.push(`${curr}${item}`)));
          output = [...temp];
        });
        
        console.log(output);

        【讨论】:

          猜你喜欢
          • 2016-10-30
          • 1970-01-01
          • 2015-03-14
          • 2018-05-14
          • 1970-01-01
          • 2011-07-07
          • 2011-08-15
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多