js 根据数组长度如何生成数组?

问题描述

两个数组嵌套循环,如何根据外层数组的长度生成,新的数组

问题出现的环境背景及自己尝试过哪些方法

第一个 数组arr中的 17和18 或许只有一个数或许是2个,当然 arr2 中对应的 time 也会是一个或者2个,然后根据这个数的个数,生成新的数组

相关代码

粘贴代码文本(请勿用截图)

数据:

{
    arr: ['17', '18'],
    arr2: [
        {
            time: '17',
            createTime: '20220217 00:00:00',
            inId: 111,
            runningCount: 202,
        },
        {
            time: '17',
            createTime: '20220217 00:05:00',
            inId: 112,
            runningCount: 220,
        },
        {
            time: '17',
            createTime: '20220217 00:10:00',
            inId: 113,
            runningCount: 210,
        },
        {
            time: '17',
            createTime: '20220217 00:15:00',
            inId: 114,
            runningCount: 52,
        },
        {
            time: '17',
            createTime: '20220217 00:20:00',
            inId: 115,
            runningCount: 12,
        },
        {
            time: '17',
            createTime: '20220217 00:25:00',
            inId: 116,
            runningCount: 72,
        },
        {
            time: '18',
            createTime: '20220217 00:00:00',
            inId: 117,
            runningCount: 120,
        },
        {
            time: '18',
            createTime: '20220217 00:05:00',
            inId: 118,
            runningCount: 32,
        },
        {
            time: '18',
            createTime: '20220217 00:10:00',
            inId: 119,
            runningCount: 82,
        },
        {
            time: '18',
            createTime: '20220217 00:15:00',
            inId: 120,
            runningCount: 42,
        },
        {
            time: '18',
            createTime: '20220217 00:20:00',
            inId: 121,
            runningCount: 92,
        },
        {
            time: '18',
            createTime: '20220217 00:25:00',
            inId: 122,
            runningCount: 32,
        },
    ]
}

想要的结构

{
    child1: [
        {
            time: '17',
            createTime: '20220217 00:00:00',
            inId: 111,
            runningCount: 202,
        },
        {
            time: '17',
            createTime: '20220217 00:05:00',
            inId: 112,
            runningCount: 220,
        },
        {
            time: '17',
            createTime: '20220217 00:10:00',
            inId: 113,
            runningCount: 210,
        },
        {
            time: '17',
            createTime: '20220217 00:15:00',
            inId: 114,
            runningCount: 52,
        },
        {
            time: '17',
            createTime: '20220217 00:20:00',
            inId: 115,
            runningCount: 12,
        },
        {
            time: '17',
            createTime: '20220217 00:25:00',
            inId: 116,
            runningCount: 72,
        },
        {
            time: '18',
            createTime: '20220217 00:00:00',
            inId: 117,
            runningCount: 120,
        },
    ],
    child2: [
        {
            time: '18',
            createTime: '20220217 00:00:00',
            inId: 117,
            runningCount: 120,
        },
        {
            time: '18',
            createTime: '20220217 00:05:00',
            inId: 118,
            runningCount: 32,
        },
        {
            time: '18',
            createTime: '20220217 00:10:00',
            inId: 119,
            runningCount: 82,
        },
        {
            time: '18',
            createTime: '20220217 00:15:00',
            inId: 120,
            runningCount: 42,
        },
        {
            time: '18',
            createTime: '20220217 00:20:00',
            inId: 121,
            runningCount: 92,
        },
        {
            time: '18',
            createTime: '20220217 00:25:00',
            inId: 122,
            runningCount: 32,
        },
    ]
}

你期待的结果是什么?实际看到的错误信息又是什么?

阅读 2.1k
2 个回答
arr2.reduce((res,v) => {
  const index = arr.indexOf(v.time);
  if(index != -1) {
    (res[`child${index+1}`] ||= []).push(v)
  }
  return res;
}, {});

其实没有 arr 也可以把组分出来,直接对 arr2 进行分组就好。不过由于数据顺序的不确定性,直接对 arr2 分组可能出现一些与结果预期不符的情况:

  • 18 在 17 的前面
  • 有除了 17 和 18 之外的其他分组数据
  • 只有 17 或者 18,甚至可能一个都没有

所以这么来看,可以理解为按 arr 进行处理,只把 arr 中存在的找出来并分组,而且按照 arr 中的数据顺序。如果某个 key 不存在于 arr2 中,那就直接给个 [] ……

const result = arr.map(() => []);
arr2.forEach(it => {
    const group = result[arr.indexOf(it.time)];
    group && group.push(it);
});

// 本来到这里就可以结束了,但是你想要的是 {child1: [], child2: []}
// 所以需要转换一下

const objResult = Object.fromEntries(result.map((group, index) => [`child${index + 1}`, group]));
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题