DingDingDang123
V2EX  ›  算法

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

  •  
  •   DingDingDang123 · Feb 26, 2022 · 2352 views
    This topic created in 1717 days ago, the information mentioned may be changed or developed.
    功能描述
    当 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 replies  •  2022-02-26 23:24:55 +08:00
    MegrezZhu
    MegrezZhu
    Feb 26, 2022❤️1
    1

    啥花里胡哨的
    binux
    binux
    Feb 26, 2022
    2
    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
    DingDingDang123
    OP
    Feb 26, 2022
    3
    @binux 大佬,太感谢了,测试可行,这就是我想要的效果
    DingDingDang123
    DingDingDang123
    OP
    Feb 26, 2022
    4
    @MegrezZhu 感谢大佬,样式很漂亮,就是不能复制,不好测试。
    sweetcola
    sweetcola
    Feb 26, 2022
    5
    const renderRowSpan = data => data.reduce((t, c) => ([...t, { rowSpan: c }, ...new Array(c - 1).fill({ rowSpan: 0 })]), []);
    Cbdy
    Cbdy
    Feb 26, 2022
    6
    @DingDingDang123 升级一下 Monterey 就可以复制了
    des
    des
    Feb 26, 2022
    7
    用 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])
    About   ·   Help   ·   Advertise   ·   Blog   ·   API   ·   FAQ   ·   Privacy   ·   Solana   ·   1098 Online   Highest 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 32ms · UTC 23:04 · PVG 07:04 · LAX 15:04 · JFK 18:04
    ♥ Do have faith in what you're doing.