V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
DingDingDang123
V2EX  ›  算法

算法题求解答:如何简化下面的代码? js 代码

  •  
  •   DingDingDang123 · 2022-02-26 17:16:48 +08:00 · 1335 次点击
    这是一个创建于 991 天前的主题,其中的信息可能已经有所发展或是发生改变。
    功能描述
    当 const mergeTable=[2]时,
    函数返回
    { rowSpan: 2 }
    { rowSpan: 0 }

    当 const mergeTable=[2,3]时,函数返回
    { rowSpan: 2 }
    { rowSpan: 0 }
    { rowSpan: 3 }
    { rowSpan: 0 }
    { rowSpan: 0 }

    当 const mergeTable=[2,3,3,2]函数返回
    { rowSpan: 2 }
    { rowSpan: 0 }
    { rowSpan: 3 }
    { rowSpan: 0 }
    { rowSpan: 0 }
    { rowSpan: 3 }
    { rowSpan: 0 }
    { rowSpan: 0 }
    { rowSpan: 2 }
    { rowSpan: 0 }

    需要优化的函数
    功能已经实现,代码冗余,请问如何优化


    ```
    // const mergeTable=[2] // 测试 ok
    const mergeTable = [2, 3]; // 测试 ok
    // const mergeTable=[2,3,3,2]; // 测试 ok

    // 如何简化这个函数
    function renderRowSpan(index) {
    for (let i in mergeTable) {
    i=Number(i);
    if (i === 0) {
    if (index === 0) {
    return { rowSpan: mergeTable[0] };
    } else if (index < mergeTable[0]) {
    return { rowSpan: 0 };
    }
    }

    if (i === 1) {
    if (index === mergeTable[0]) {
    return { rowSpan: mergeTable[1] };
    }
    if (index < mergeTable[0] + mergeTable[1]) {
    return { rowSpan: 0 };
    }
    }

    if (i === 2) {
    if (index === mergeTable[0] + mergeTable[1]) {
    return { rowSpan: mergeTable[2] };
    }
    if (index < mergeTable[0] + mergeTable[1] + mergeTable[2]) {
    return { rowSpan: 0 };
    }
    }


    if (i === 3) {
    if (index === mergeTable[0] + mergeTable[1]+mergeTable[2]) {
    return { rowSpan: mergeTable[3] };
    }
    if (index < mergeTable[0] + mergeTable[1] + mergeTable[2]+ mergeTable[3]) {
    return { rowSpan: 0 };
    }
    }
    }
    }

    // 外部方法会渲染 index
    for (let index = 0; index < 10; index++) {
    console.log(renderRowSpan(index));
    }

    ```
    7 条回复    2022-02-26 23:24:55 +08:00
    MegrezZhu
        1
    MegrezZhu  
       2022-02-26 17:34:52 +08:00   ❤️ 1

    啥花里胡哨的
    binux
        2
    binux  
       2022-02-26 17:55:43 +08:00
    function renderRowSpan(index) {
    for (let i of mergeTable) {
    if (index == 0) return { rowSpan: i };
    if (index < 0) return { rowSpan: 0 };
    index -= i;
    }
    if (index < 0) return { rowSpan: 0 };
    }
    DingDingDang123
        3
    DingDingDang123  
    OP
       2022-02-26 18:03:26 +08:00
    @binux 大佬,太感谢了,测试可行,这就是我想要的效果
    DingDingDang123
        4
    DingDingDang123  
    OP
       2022-02-26 20:40:37 +08:00
    @MegrezZhu 感谢大佬,样式很漂亮,就是不能复制,不好测试。
    sweetcola
        5
    sweetcola  
       2022-02-26 20:59:17 +08:00
    const renderRowSpan = data => data.reduce((t, c) => ([...t, { rowSpan: c }, ...new Array(c - 1).fill({ rowSpan: 0 })]), []);
    Cbdy
        6
    Cbdy  
       2022-02-26 21:08:42 +08:00
    @DingDingDang123 升级一下 Monterey 就可以复制了
    des
        7
    des  
       2022-02-26 23:24:55 +08:00
    用 flat 更简洁易懂一点,顺便给你做了错误处理
    const makeRowSpan = i => ({ rowSpan: i })
    const makeRowBySpanNum = num => [makeRowSpan(num), ...new Array(--num).fill(makeRowSpan(0))]
    const makeSpan = rows => rows?.filter(Number.isFinite).map(makeRowBySpanNum).flat() ?? []
    makeSpan([2,3,3,null,2])
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   5710 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 33ms · UTC 03:17 · PVG 11:17 · LAX 19:17 · JFK 22:17
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.