js如何实现数组数据的上移下移

5 篇文章 0 订阅

Vue项目开发中碰到对表格数据实现上移,下移的需求,只是纯前端实现移动数组数据,不跟服务端做交互。

经研究,用splice方法简洁优雅,具体实现如下:

        // 上移,下移
        onMove(code, dir) {
            let moveComm = (curIndex, nextIndex) => {
                let arr = this.stack.selAwardList
                arr[curIndex] = arr.splice(nextIndex, 1, arr[curIndex])[0]
                return arr
            }
            this.stack.selAwardList.some((val, index) => {
                if (val.awardCode === code) {
                    if (dir === 1 && index === 0) {
                        this.$message.warning('已在顶部!')
                    } else if (dir === 0 && index === this.stack.selAwardList.length - 1) {
                        this.$message.warning('已在底部!')
                    } else {
                        let nextIndex = dir === 1 ? index - 1 : index + 1
                        this.stack.selAwardList = moveComm(index, nextIndex)
                    }
                    return true
                }
                return false
            })
        }

解释一下实现原理:

1、onMove()方法的传参code是this.stack.selAwardList数组元素的属性,用some遍历循环找到该数据在数组中的索引值(index)后停止遍历循环,dir传1表示上移,传0表示下移,根据dir的值得出nextIndex的索引值。

2、moveComm方法实现调换索引数据后返回换位后的数组。arr[curIndex] = arr.splice(nextIndex, 1, arr[curIndex])[0]做了3件事:

第一件:arr.splice(nextIndex, 1)删除下个索引的数据

第二件:arr.splice(nextIndex, 1, arr[curIndex])用当前索引数据(arr[curIndex])替换下个索引的数据

第三件:arr[curIndex] = arr.splice(nextIndex, 1, arr[curIndex])[0]当arr.splice()方法执行后会返回删除的数据,并将删除的数据赋值给当前索引

说的有点啰嗦,总的意思是这句代码同时完成了2个索引的赋值。

大家有其他更优雅的实现方法欢迎提出。

假设有以下数组: ```javascript const arr = [ { name: "apple", check: true }, { name: "banana", check: false }, { name: "cherry", check: true }, { name: "date", check: true }, { name: "elderberry", check: false }, ]; ``` 我们可以使用JavaScript来实现数组中的数据根据每项的check是否为true进行多个上移下移的操作。下面是一个示例代码: ```javascript function moveUp(arr, index) { if (index === 0) { return; } const item = arr[index]; arr.splice(index, 1); arr.splice(index - 1, 0, item); } function moveDown(arr, index) { if (index === arr.length - 1) { return; } const item = arr[index]; arr.splice(index, 1); arr.splice(index + 1, 0, item); } function moveCheckedItems(arr, direction) { const checkedItems = arr.filter((item) => item.check); checkedItems.forEach((item) => { const index = arr.indexOf(item); if (direction === "up") { moveUp(arr, index); } else if (direction === "down") { moveDown(arr, index); } }); } ``` 在这个示例代码中,我们定义了三个函数: - `moveUp(arr, index)`:将数组中指定索引位置的项向上移动一位。 - `moveDown(arr, index)`:将数组中指定索引位置的项向下移动一位。 - `moveCheckedItems(arr, direction)`:将数组中所有check属性为true的项按照指定的方向进行移动。如果方向为"up",则向上移动;如果方向为"down",则向下移动。 我们可以使用以下代码来测试以上函数: ```javascript console.log(arr); moveCheckedItems(arr, "up"); console.log(arr); moveCheckedItems(arr, "down"); console.log(arr); ``` 运行结果: ```javascript // 原始数组 [ { name: "apple", check: true }, { name: "banana", check: false }, { name: "cherry", check: true }, { name: "date", check: true }, { name: "elderberry", check: false }, ] // 向上移动check为true的项 [ { name: "apple", check: true }, { name: "cherry", check: true }, { name: "date", check: true }, { name: "banana", check: false }, { name: "elderberry", check: false }, ] // 向下移动check为true的项 [ { name: "apple", check: true }, { name: "date", check: true }, { name: "cherry", check: true }, { name: "banana", check: false }, { name: "elderberry", check: false }, ] ```
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值