代码之家  ›  专栏  ›  技术社区  ›  Nick

按设置的顺序合并两个数组-对于每6个数组项,从第二个数组中添加4个项

  •  1
  • Nick  · 技术社区  · 3 年前

    我有两个数组,加起来等于50。

    我想按顺序合并两组数据。。。所以每6个数字就有4个字母。

    const merged = [1,1,1,1,1,1,'A','A','A','A' ... * 5]
    

    const n = [1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1];
    const a = ["A", "A", "A", "A", "A", "A", "A", "A", "A", "A", "A", "A"
              , "A", "A", "A", "A", "A", "A", "A", "A"];
    
    const merged = [...Array(n.length + a.length).keys()].map((i) => {
      if (
        i === 6 ||
        i === 7 ||
        i === 8 ||
        i === 9 ||
        i === 16 ||
        i === 17 ||
        i === 18 ||
        i === 19 ||
        i === 26 ||
        i === 27 ||
        i === 28 ||
        i === 29 ||
        i === 36 ||
        i === 37 ||
        i === 38 ||
        i === 39 ||
        i === 46 ||
        i === 47 ||
        i === 48 ||
        i === 49
      ) {
        const item = a[0];
        a.shift();
        return item;
      }
    
      const item = n[0];
      n.shift();
      return item;
    });
    
    console.log( merged )
    .as-console-wrapper {max-height: 100%!important;top:0}

    这个很好用。只是看起来太过分了?

    const idx = i + 1;
      if (idx % 7 === 0 || idx % 8 === 0 || idx % 9 === 0 || idx % 10 === 0) {
    

    任何想法都将不胜感激!

    2 回复  |  直到 3 年前
        1
  •  3
  •   Bergi    3 年前

    最简单(最直接)的可能是

    const merged = [];
    // assert: n.length == 30 && a.length == 20
    let i=0, j=0;
    while (merged.length < 50) {
        for (let k=0; k<6; k++)
            merged.push(n[i++]);
        for (let k=0; k<4; k++)
            merged.push(a[j++]);
    }
    

    或者如果你不介意破坏性的话

    const merged = []
    while (a.length || n.length) {
        merged.push(...n.splice(0, 6));
        merged.push(...a.splice(0, 4));
    }
    

    const merged = Array.from({length: 50}, (_, index) => {
        const rem = index % 10;
        const round = (index-rem) / 10;
        return r < 6
            ? n[round * 6 + rem]
            : a[round * 4 + rem - 6];
    });
    
        2
  •  0
  •   Talmacel Marian Silviu    3 年前

    const n = [1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1];
    const a = ["A", "A", "A", "A", "A", "A", "A", "A", "A", "A", "A", "A", "A", "A", "A", "A", "A", "A", "A", "A"];
    
    const merged = n.reduce((acc, val, index) => {
      const iteration = parseInt(index / 6);
      return index % 6 === 5
        ? [...acc, val, ...a.slice(iteration * 4, iteration * 4 + 4)]
        : [...acc, val];
    }, []);
    
    console.log(merged);
        3
  •  0
  •   customcommander    3 年前

    让我们编写一个函数,将数组分割成 块:

    const group =
      (n, xs, ret = []) =>
        xs.length <= n
          ? [...ret, xs]
          : group(n, xs.slice(n), [...ret, xs.slice(0, n)]);
    
    group(2, [1, 2, 3, 4, 5, 6, 7, 8]);
    //=> [ [1, 2]
    //=> , [3, 4]
    //=> , [5, 6]
    //=> , [7, 8]]
    

    然后,让我们编写一个函数,它接受两个块数组,并将具有相似索引的块连接在一起。(一个块数组用完后立即停止。)

    const Nil = Symbol();
    
    const join =
      ([x = Nil, ...xs], [y = Nil, ...ys], ret = []) =>
        x === Nil || y === Nil
          ? ret
          : join(xs, ys, ret.concat(x, y));
    
    join([[1, 2], [5, 6]], [[3, 4], [7, 8]]);
    //=> [1, 2, 3, 4, 5, 6, 7, 8]
    

    把所有东西放在一起:

    join( group(6, [1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1])
        , group(4, ["A","A","A","A","A","A","A","A","A","A","A","A","A","A","A","A","A","A","A","A"]));
    
    //=> [ 1, 1, 1, 1, 1, 1, "A", "A", "A", "A"
    //=> , 1, 1, 1, 1, 1, 1, "A", "A", "A", "A"
    //=> , 1, 1, 1, 1, 1, 1, "A", "A", "A", "A"
    //=> , 1, 1, 1, 1, 1, 1, "A", "A", "A", "A"
    //=> , 1, 1, 1, 1, 1, 1, "A", "A", "A", "A"]