【问题标题】:Pure js arrays merge where elements alternate [duplicate]纯js数组在元素交替的地方合并[重复]
【发布时间】:2019-04-30 03:21:59
【问题描述】:

我找到了this question,但它已关闭,作者将其缩小到 jQuery,答案仅适用于两个数组大小相等的情况。

所以我的问题是如何合并两个元素交替的任意数组? (作为回答提供函数m(a,b),它接受两个数组ab并返回合并数组)

测试用例:

var as = [1,2,3];
var am = [1,2,3,4,5];
var al = [1,2,3,4,5,6,7];
var b  = ["a","b","c","d","e"];

var m = (a,b) => "...magic_here..."; 

m(as,b); // -> [1,"a",2,"b",3,"c","d","e"] 
m(am,b); // -> [1,"a",2,"b",3,"c",4,"d",5,"e"] 
m(al,b); // -> [1,"a",2,"b",3,"c",4,"d",5,"e",6,7] 

【问题讨论】:

标签: javascript arrays


【解决方案1】:

你可以这样做:

const as = [1,2,3];
const am = [1,2,3,4,5];
const al = [1,2,3,4,5,6,7];
const b  = ["a","b","c","d","e"];

const m = (a, b) => (a.length > b.length ? a : b)
  .reduce((acc, cur, i) => a[i] && b[i] ? [...acc, a[i], b[i]] : [...acc, cur], []);

console.log(m(as,b)); // -> [1,"a",2,"b",3,"c","d","e"]
console.log(m(am,b)); // -> [1,"a",2,"b",3,"c",4,"d",5,"e"]
console.log(m(al,b)); // -> [1,"a",2,"b",3,"c",4,"d",5,"e",6,7]
.as-console-wrapper { max-height: 100% !important; top: 0; }

【讨论】:

  • 尝试运行自己的代码并查看结果
  • @YongQuan,你说得对……谢谢你的评论。答案已更新
  • 第一个日志仍然不是预期的结果
  • @YongQuan 对不起,你又说对了.. 代码已修复
【解决方案2】:

一个非常简单的方法是循环并检查值是否存在。如果是,则按 else 继续。

解决方案 1

function alternateMerge(a1, a2) {
  var length = Math.max(a1.length, a2.length);
  var output = [];
  for(var i = 0; i< length; i++) {
    if (!!a1[i]) {
      output.push(a1[i])
    }
    if (!!a2[i]) {
      output.push(a2[i])
    }
  }
  return output;
}

var as = [1,2,3];
var am = [1,2,3,4,5];
var al = [1,2,3,4,5,6,7];
var b  = ["a","b","c","d","e"];

console.log(alternateMerge(as, b).join())
console.log(alternateMerge(am, b).join())
console.log(alternateMerge(al, b).join())

解决方案 2

function alternateMerge(a1, a2) {
  const arr = a1.length > a2.length ? a1 : a2;
  return arr.reduce((acc, _, i) => {
    !!a1[i] && acc.push(a1[i]);
    !!a2[i] && acc.push(a2[i]);
    return acc;
  }, [])
}

var as = [1,2,3];
var am = [1,2,3,4,5];
var al = [1,2,3,4,5,6,7];
var b  = ["a","b","c","d","e"];

console.log(alternateMerge(as, b).join())
console.log(alternateMerge(am, b).join())
console.log(alternateMerge(al, b).join())

【讨论】:

    【解决方案3】:

    您可以遍历所有元素并将其添加到结果中。

    const as = [1, 2, 3];
    const am = [1, 2, 3, 4, 5];
    const al = [1, 2, 3, 4, 5, 6, 7];
    const b  = ["a", "b", "c", "d", "e"];
    
    function m(a, b) {
      const l = Math.max(a.length, b.length);
      const result = [];
      for (let i = 0; i < l; i++) {
        if (a[i] !== undefined) {
          result.push(a[i]);
        }
        if (b[i] !== undefined) {
          result.push(b[i]);
        }
      }
      
      console.log(result);
      return result;
    }
    
    m(as, b); // -> [1,"a",2,"b",3,"c","d","e"] 
    m(am, b); // -> [1,"a",2,"b",3,"c",4,"d",5,"e"] 
    m(al, b); // -> [1,"a",2,"b",3,"c",4,"d",5,"e",6,7] 

    【讨论】:

      【解决方案4】:

      您可以使用array#concatspread syntax 来生成交替合并的数组。

      var m = (a,b) => {
        const minLen = Math.min(a.length, b.length);
        return [].concat(...a.slice(0, minLen).map((v,i) => [v, b[i]]), a.slice(minLen, a.length), b.slice(minLen, b.length));
      };
      
      var as = [1,2,3];
      var am = [1,2,3,4,5];
      var al = [1,2,3,4,5,6,7];
      var b  = ["a","b","c","d","e"];
      
      console.log(m(as,b)); // -> [1,"a",2,"b",3,"c","d","e"] 
      console.log(m(am,b)); // -> [1,"a",2,"b",3,"c",4,"d",5,"e"] 
      console.log(m(al,b)); // -> [1,"a",2,"b",3,"c",4,"d",5,"e",6,7]

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-07-29
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-09-10
        相关资源
        最近更新 更多