【问题标题】:Javascript - How to concatenate string values from two arrays of different sizes?Javascript - 如何连接来自两个不同大小的数组的字符串值?
【发布时间】:2018-01-23 22:18:40
【问题描述】:

我有两个数组,例如:

数组1:

arr1 = ["Precon", "Contra", "Postco", "Cancel", "Consul"]

数组2:

arr2 = ["EJID", "EMBA", "EMPR", "GOBI", "PART", "PPOL", "SACI", "SOFL", "SOFM", "0000", "", "0002", "0003", "0004", "0005", "0006", "0007", "0008", "0009", "0010", "0011", "0012", "0013", "0014", "0015", "0016", "011", "0110", "9999"]

我想从上面的两个中生成一个新数组,将单个项目递归地连接成新项目,以递归方式为 array1 中的每个项目生成一个最终数组,如下所示:

final = ['Precon-EJID', 'Contra-EJID', 'Postco-EJID', 'Cancel-EJID', 'Consul-EJID', 'Precon-EMBA', 'Contra-EMBA', 'Postco-EMBA', 'Cancel-EMBA', 'Consul-EMBA', 'Precon-EMPR', 'Contra-EMPR', 'Postco-EMPR', 'Cancel-EMPR', 'Consul-EMPR'...etc]

提前谢谢你

【问题讨论】:

  • 您尝试的代码有什么问题?
  • 你试过什么?这可以通过多种不同的循环方法来完成
  • final重要的订单
  • 对该问题发布的多个答案证明,“否决”和“接近”投票标准和理由(如果有的话)是完全武断和反复无常的。没关系。请注意,如果有任何回答此问题的用户大胆发表评论,质疑该用户在 SO 上回答任何问题,请注意。任何发布此问题答案的用户都不应该在“因为 ->(“为什么这段代码不起作用?”)的前提下投票关闭另一个问题,否则即使只有你知道,投票也是欺诈性的这个事实

标签: javascript arrays string multidimensional-array


【解决方案1】:

您可以使用 2 个简单的 for of 循环来做到这一点:

var arr1 = ["Precon", "Contra", "Postco", "Cancel", "Consul"];

var arr2 = ["EJID", "EMBA", "EMPR", "GOBI", "PART", "PPOL", "SACI", "SOFL", "SOFM", "0000", "", "0002", "0003", "0004", "0005", "0006", "0007", "0008", "0009", "0010", "0011", "0012", "0013", "0014", "0015", "0016", "011", "0110", "9999"]

var finalArr = [];

for ( var item2 of arr2 ) {
  for ( var item1 of arr1 ) {
    finalArr.push(`${item1}-${item2}`);
  }
}

console.log(finalArr);

【讨论】:

    【解决方案2】:

    您可以使用嵌套的Array#map 调用,并使用Array#concat 展平结果:

    const arr1 = ["Precon", "Contra", "Postco", "Cancel", "Consul"]
    
    const arr2 = ["EJID", "EMBA", "EMPR", "GOBI", "PART", "PPOL", "SACI", "SOFL", "SOFM", "0000", "", "0002", "0003", "0004", "0005", "0006", "0007", "0008", "0009", "0010", "0011", "0012", "0013", "0014", "0015", "0016", "011", "0110", "9999"]
    
    const result = [].concat(...arr2.map((s1) => arr1.map((s2) => `${s2}-${s1}`)))
    
    console.log(result)

    【讨论】:

    • 可靠的答案。不得不使用新的扩展语法 (...) 有点麻烦,但是可以工作并且不需要第三个“构建数组”。
    【解决方案3】:

    这是一个单一的班轮来做到这一点:

    arr1 = ["Precon", "Contra", "Postco", "Cancel", "Consul"]
    arr2 = ["EJID", "EMBA", "EMPR", "GOBI", "PART", "PPOL", "SACI", "SOFL", "SOFM", "0000", "", "0002", "0003", "0004", "0005", "0006", "0007", "0008", "0009", "0010", "0011", "0012", "0013", "0014", "0015", "0016", "011", "0110", "9999"]
    
    const result = [].concat(...arr1.map(prefix => arr2.map(suffix => prefix+suffix)));
    console.log(result)
    
    // EDIT: if order matters, reverse the use of arr1 and arr2:
    
    const orderedResult = [].concat(...arr2.map(suffix => arr1.map(prefix => prefix+suffix)));
    console.log(orderedResult)

    【讨论】:

    • 为什么是[].concat
    • 您的输出与所需的输出不匹配:p
    • 扁平化数组,使所有项目都处于同一级别。没有它,结果将是一个二维数组:[["PreconEJID", ...], ["ContraEJID", ...], ...]
    • @JaromandaX 我虽然做到了?以什么方式? OP 的最终数组没有嵌套。还是说顺序不对?
    • @CRice OP 没有指定任何特定的结果排序
    【解决方案4】:

    const prefixes = [
      "Precon",
      "Contra",
      "Postco",
      "Cancel",
      "Consul"
    ];
    
    const suffixes = [
      "EJID", "EMBA", "EMPR",
      "GOBI", "PART", "PPOL",
      "SACI", "SOFL", "SOFM",
      "0000", "", "0002",
      "0003", "0004", "0005",
      "0006", "0007", "0008",
      "0009", "0010", "0011",
      "0012", "0013", "0014",
      "0015", "0016", "011",
      "0110", "9999"
    ];
    
    const results = suffixes
      .map(suffix => prefixes.map(prefix => prefix + '-' + suffix))
      .reduce((xs, ys) => [...xs, ...ys]);
    
    console.log(results);

    【讨论】:

    • 前缀/后缀之间应该有破折号
    • @FrankerZ 如果我们假设“应该”是什么。 OP 应该首先做出一点努力来解决他们自己的询问,而这完全没有出现在问题中。
    【解决方案5】:

    另一种选择是使用 reduce...

    let arr1 = ["Precon", "Contra", "Postco", "Cancel", "Consul"]
    
    let arr2 = ["EJID", "EMBA", "EMPR", "GOBI", "PART", "PPOL", "SACI", "SOFL", "SOFM", "0000", "", "0002", "0003", "0004", "0005", "0006", "0007", "0008", "0009", "0010", "0011", "0012", "0013", "0014", "0015", "0016", "011", "0110", "9999"]
    
    let arr3 = arr2.reduce((arr, val) => {
        let f = []
        arr1.forEach(itm => val && f.push(itm + '-' + val))
        return arr.concat(f)
    }, [])
    
    console.log(arr3)

    【讨论】:

      【解决方案6】:

      这是一个递归的。就像OP问的那样。花了我一段时间。 :P

      arr1 = ["Precon", "Contra", "Postco", "Cancel", "Consul"]
      
      arr2 = ["EJID", "EMBA", "EMPR", "GOBI", "PART", "PPOL", "SACI", "SOFL", "SOFM", "0000", "", "0002", "0003", "0004", "0005", "0006", "0007", "0008", "0009", "0010", "0011", "0012", "0013", "0014", "0015", "0016", "011", "0110", "9999"]
      
      var arr = [];
      
      console.log(concat(arr1, arr2, 0, 0, 0));
      
      function concat(arr1, arr2, arrIndex, index1, index2) {
        //console.log(arr1.length);
        if (index2 === (arr2.length)) {
          return;
        } else {
          arr[arrIndex] = arr1[index1] + '-' + arr2[index2];
          if (index1 !== (arr1.length - 1)) {
            index1++;
          } else if (index1 === (arr1.length - 1)) {
            index1 = 0;
            index2++;
            //concat(arr1, arr2, ++arrIndex, index1, index2++); // Not here dummy :P
          }
          concat(arr1, arr2, ++arrIndex, index1, index2++);
        }
        return arr;
      }

      【讨论】:

        猜你喜欢
        • 2015-04-29
        • 2013-10-21
        • 2021-03-31
        • 2021-12-01
        • 1970-01-01
        • 1970-01-01
        • 2019-09-12
        • 2018-05-08
        • 1970-01-01
        相关资源
        最近更新 更多