js数组删除元素?
如上图片, 每个方块都有一个宽,高,X轴,Y轴;有可能宽占多份, 高占多份; 但宽度最大就占3份, 高度不限;每次删除一个格子, 下面的格子自动往左往上补齐;
给到数据假如是:
[
{id: 1, w: 1, h: 1, x: 0, y: 0},
{id: 2, w: 1, h: 1, x: 1, y: 0},
{id: 3, w: 1, h: 1, x: 2, y: 0},
{id: 4, w: 1, h: 1, x: 0, y: 1},
{id: 5, w: 1, h: 1, x: 1, y: 1},
{id: 6, w: 1, h: 1, x: 2, y: 1},
{id: 7, w: 1, h: 1, x: 0, y: 2},
{id: 8, w: 1, h: 1, x: 1, y: 2},
{id: 9, w: 1, h: 1, x: 2, y: 2}
]
删除id为5的格子后,希望得到的是:
[
{id: 1, w: 1, h: 1, x: 0, y: 0},
{id: 2, w: 1, h: 1, x: 1, y: 0},
{id: 3, w: 1, h: 1, x: 2, y: 0},
{id: 4, w: 1, h: 1, x: 0, y: 1},
{id: 6, w: 1, h: 1, x: 1, y: 1},
{id: 7, w: 1, h: 1, x: 2, y: 1},
{id: 8, w: 1, h: 1, x: 0, y: 2},
{id: 9, w: 1, h: 1, x: 1, y: 2}
]
回复
1个回答

test
2024-06-30
你提供的规则并不完善,我加了一些。
<script setup>
import { ref, computed } from "vue";
let data = ref([
{ id: 1, w: 1, h: 1, x: 0, y: 0 },
{ id: 2, w: 1, h: 1, x: 1, y: 0 },
{ id: 3, w: 1, h: 1, x: 2, y: 0 },
{ id: 4, w: 1, h: 1, x: 0, y: 1 },
{ id: 5, w: 1, h: 2, x: 1, y: 1 },
{ id: 6, w: 2, h: 1, x: 0, y: 3 },
{ id: 7, w: 1, h: 1, x: 2, y: 3 },
{ id: 8, w: 1, h: 1, x: 1, y: 2 },
{ id: 9, w: 1, h: 1, x: 0, y: 4 },
]);
const dataPlus = computed(() => {
const maxX = 3;
let nowXY = { x: 0, y: 0 };
let XYArr = [];
function getXY(target) {
if (XYArr.includes(`x${nowXY.x}y${nowXY.y}`)) {
if (nowXY.x < maxX - 1) {
nowXY.x++;
} else {
nowXY.x = 0;
nowXY.y++;
}
getXY(target);
} else if (target.w > 1) {
let bool = new Array(target.w - 1)
.fill(0)
.every(
(e, i) =>
nowXY.x + 1 + i < maxX &&
!XYArr.includes(`x${nowXY.x + 1 + i}y${nowXY.y}`)
);
if (!bool) {
nowXY.x = 0;
nowXY.y++;
getXY(target);
}
}
}
function setXY(target) {
for (let y = 0; y < target.h; y++) {
for (let x = 0; x < target.w; x++) {
XYArr.push(`x${nowXY.x + x}y${nowXY.y + y}`);
}
}
}
return data.value.map((e) => {
getXY(e);
setXY(e);
Object.assign(e, nowXY);
return e;
});
});
function styleFun(param) {
let style = {
width: param.w * 100 + "px",
height: param.h * 100 + "px",
top: param.y * 100 + "px",
left: param.x * 100 + "px",
};
return style;
}
function deleteFun(param) {
data.value = data.value.filter((e) => e.id != param.id);
}
</script>
<template>
<main>
<div
v-for="e in dataPlus"
:key="e.id"
:style="styleFun(e)"
@click="deleteFun(e)"
>
{{ e.id }}
</div>
</main>
</template>
<style lang="less" scoped>
main {
width: 100vw;
height: 100vh;
position: absolute;
top: 0%;
left: 0%;
div {
background-color: #ccc;
border: 1px solid;
position: absolute;
box-sizing: border-box;
display: flex;
justify-content: center;
align-items: center;
font-size: 20px;
color: white;
&:hover {
background-color: rgb(175, 241, 203);
cursor: pointer;
}
}
}
</style>
回复

适合作为回答的
- 经过验证的有效解决办法
- 自己的经验指引,对解决问题有帮助
- 遵循 Markdown 语法排版,代码语义正确
不该作为回答的
- 询问内容细节或回复楼层
- 与题目无关的内容
- “赞”“顶”“同问”“看手册”“解决了没”等毫无意义的内容