将两组数组连接,将各剩余的数组元素放入一个新的数组中?

依依雨柔
  • 233
var a=[
        [
          1,
          2,
          3
        ], [
           4,
           5,
           6
        ]
    ];
var b= [
    [7,8,9,10], 
    [11,12,13,14], 
    [15,16,17,18],
    [19,20,21,22]
];

将a数组中的每个元素(1,2,3等)与b中的每个数组元素 ([7,8,9,10], [11,12,13,14]等)连接,产生一个新的数组

c=[
[[1],[7,8,9,10]],
[[2],[11,12,13,14]],
[[3],[15,16,17,18]],
[[4],[19,20,21,22]]
]

和一个剩余的d=[[5,6]],如何写代码?

评论
阅读 486
4 个回答
✓ 已被采纳

受其他答主启发:

let [c, d] = (a => [b.map((_, i) => [[a[i]], _]), [a.slice(b.length)]])(a.flat())

感觉这样应该是最短了吧哈哈哈。


a.flatMap(_ => _)        // 将 a 展开为 [1, 2, 3, 4, 5, 6]
.reduce((p, c, i) => [
    i < b.length
        ? [p.arr = p.arr || [],     // 当 b[i] 存在时,根据情况初始化 p.arr
           p.arr.push([[c], b[i]])] // 构造数组 [[a[i]], b[i]]
        : [p.last = p.last || [[]], // 当 b[i] 不存在时,根据情况初始化 p.last
           p.last[0].push(c)],      // 填充 a[i] 至 p.last[0]
    p][1],                          // 通过数组机制 (构造数组时会对每个元素进行求值操作) 获取处理后的 p
{})                                 // 提供初始容器

// 输出
{
    arr: [
        [[1], [7, 8, 9, 10]],
        [[2], [11, 12, 13, 14]],
        [[3], [15, 16, 17, 18]],
        [[4], [19, 20, 21, 22]]
    ],
    last: [[5, 6]]
}
var c = [];
var _a = c.concat.apply(c, a);
var length = b.length;
for (var i = length; i--;) c.unshift([[_a[i]], b[i]]);
var d = [_a.slice(length)];
console.log(c, d);
function getArr(a,b){
 for(var x=0,idx=-1,obj={};x<a.length;x++){ //idx 新生成数组下标
    for(var y=0;y<a[x].length;y++){
      idx++;
      if(!obj.data) obj.data = [];
      idx<b.length?(obj.data.push([[a[x][y]],b[idx]])): //两个数组能匹配时分别压入新数组
          (!obj.rest?(obj.rest = [[a[x][y]]]):obj.rest[0].push(a[x][y])) //匹配不上时单独归为一个数组
    }
  }
  return obj;
}
var _a = a.flat();
var c = b.map((v,k) => [[_a[k]],v])
var d = [_a.splice(b.length)]
宣传栏