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

2022-02-26 17:16:48 +08:00
 DingDingDang123
功能描述
当 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));
}

```
1344 次点击
所在节点    算法
7 条回复
MegrezZhu
2022-02-26 17:34:52 +08:00

啥花里胡哨的
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
2022-02-26 18:03:26 +08:00
@binux 大佬,太感谢了,测试可行,这就是我想要的效果
DingDingDang123
2022-02-26 20:40:37 +08:00
@MegrezZhu 感谢大佬,样式很漂亮,就是不能复制,不好测试。
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
2022-02-26 21:08:42 +08:00
@DingDingDang123 升级一下 Monterey 就可以复制了
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])

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/836600

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX