【问题标题】:Join members of two arrays by order [duplicate]按顺序连接两个数组的成员[重复]
【发布时间】:2016-06-17 02:43:12
【问题描述】:

我相信可以将数组连接起来,然后放入带有自定义分隔符的字符串,如下所示:

var a1 = ["apple","orange"];
var a2 = ["hot", "cold"];
var a3 = a1.concat(a2); 
var str = a3.join("_");

但是,结果将是:

apple_orange_hot_cold  

我希望将 a1 的每个成员与相应的 a2 成员连接起来,其中对应按数组中的顺序发生。假设 a1 中的成员数量总是等于 a2 中的数量。所以,我希望输出是一个看起来像这样的字符串:

apple_hot_orange_cold

最好的方法是什么?

【问题讨论】:

  • 两个数组的元素个数总是一样吗?
  • @Archer "假设 a1 中的成员数量总是等于 a2 中的数量"
  • 大声笑。呸!谢谢:)

标签: javascript


【解决方案1】:

将您的数组与reduce 函数而不是concat 组合:

var a1 = ["apple","orange"];
var a2 = ["hot", "cold"];

var str = a1.reduce(function(r, v, i) {
    r.push(v, a2[i]);
    return r;
},[]).join('_');

使用 ES6 语法的解决方案:

let str = a1.reduce((r, v, i) => [...r, v, a2[i]], []).join('_');

map 的替代解决方案:

let str = a1.map((v, i) => `${v}_${a2[i]}`).join('_');

【讨论】:

    【解决方案2】:

    如果有项目,我将遍历所有项目并将新数组与项目组合。

    此解决方案适用于相等和不等的数组长度。

    var a1 = ["apple", "orange", 'ddd'],
        a2 = ["hot", "cold"],
        result = function (a1, a2) {
            var l = Math.max(a1.length, a2.length),
                i,
                r = [];
            for (i = 0; i < l; i++) {
                i in a1 && r.push(a1[i]);
                i in a2 && r.push(a2[i]);
            }
            return r;            
        }(a1, a2);
    
    document.write(result.join('_'));

    【讨论】:

    • 我将使用 Math.min 来避免在数组外调用
    • 是的,如果不相等的部分应该被丢弃,那就可以了,但是我检查带有i in a1 &amp;&amp; r.push(a1[i]);的项目并相应地推送。
    【解决方案3】:

    您可以通过一个简单的for 循环来做到这一点:

    var a1 = ["apple","orange"],
        a2 = ["hot", "cold"],
        str = "";
    
    for (var i = 0; i < a1.length; i++)
      str += (i === 0 ? "" : "_") + a1[i] + "_" + a2[i]
    
    alert(str);

    (i === 0 ? "" : "_") 部分只是检查我们是否处于第一次迭代;如果是,则不会在前面添加任何内容,否则会添加额外的下划线。

    【讨论】:

      【解决方案4】:

      另一种选择:

      var a1 = ["apple","orange"];
      var a2 = ["hot", "cold"];
      var a3 = [];
      
      a1.forEach(function(a, i) {
        [a, a2[i]].forEach(function(b) {
          a3.push(b);
        });
      });
      
      alert(a3.join('_'));

      或者使用 ES6 语法,您可以将其作为一个超级干净的单线:

      var a1 = ["apple","orange"];
      var a2 = ["hot", "cold"];
      var a3 = [];
      
      a1.forEach((a, i) => [a, a2[i]].forEach((b) => a3.push(b)));
      
      alert(a3.join('_'));

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2016-06-11
        • 1970-01-01
        • 2019-11-19
        • 2014-12-27
        • 1970-01-01
        • 1970-01-01
        • 2018-03-06
        • 1970-01-01
        相关资源
        最近更新 更多