数组对象混合,错位插入生成新数组

问题:一个数组,每一项进行混合

描述:错位进行插入,或者其他的排序思路

// 输入
let arr = [
  [
    { id: 1, time: '1:2' },
    { id: 2, time: '1:3' },
    { id: 3, time: '1:4' },
  ],
  [
    { id: 11, time: '1:2' },
    { id: 22, time: '1:3' },
    { id: 33, time: '1:4' },
  ],
  [
    { id: 21, time: '1:2' },
    { id: 32, time: '1:3' },
    { id: 43, time: '1:4' },
  ],
]

// 目标输出
let res = [
  { id: 1, time: '1:2' },
  { id: 11, time: '1:2' },
  { id: 21, time: '1:2' },
  { id: 2, time: '1:3' },
  { id: 22, time: '1:3' },
  { id: 32, time: '1:3' },
  { id: 3, time: '1:4' },
  { id: 33, time: '1:4' },
  { id: 43, time: '1:4' },
]

function mixFn(arr) {
  let res = []
  // some thing...
  return res
}
阅读 2.2k
3 个回答

前两天刚有人问过一个两数组合并的,类似嘛

function mixFn(arr) {
  return Array.from(
    { length: Math.max(...arr.map(i => i.length)) }, 
    (_, i) => arr.map(j => j[i])
  ).flat()
}
function mixFn(arr) {
    var res = [];
    for (var i = 0; i < arr.length; ++i) {
        for (var j = 0; j < arr[i].length; ++j) {
            (res[j] = res[j] || []).push(arr[i][j]);
        }
    }
    return res.concat.apply([], res);
}
console.dir(mixFn(arr));

如果子数据长度相同倒是简单

arr[0].flatMap((_, i) => arr.map(it => it[i]));

如果不同……先找最大长度(下载的算法需要有效数组不含 undefined

const maxLength = Math.max(...arr.map(it => it.length));
const r = [...Array(maxLength).keys()].flatMap(
    (_, i) => arr.map(it => it[i]).filter(it => it !== undefined)
);
推荐问题