JS实现表格数据上移下移

本文介绍了如何在大数据列表中添加功能,以便用户对数据进行权重划分和查找。主要展示了两个关键函数:用于比较对象相等的isEqual函数和处理数据移动(上移和下移)的moveUp和moveDown函数,强调了代码的复用性和可扩展性。附有相关代码及操作效果示例。
摘要由CSDN通过智能技术生成

一、背景

根据客户的使用感受来提出的需求,存在数据量大的列表中需要添加此功能。方便用户对数据权重的进行划分,方便用户查找数据。我将从以下几个方面介绍如何完成这个需求。

二、代码

代码给出重要部分的,下面会有相关的代码注解,如果有什么疑问,欢迎提问。如果有什么更好的解决方式,那就更好了。欢迎各位大佬指教。

        // 定义一个函数,用来比较两个对象是否相等
        isEqual: function (obj1, obj2) {
            return JSON.stringify(Object.entries(obj1).sort()) === JSON.stringify(Object.entries(obj2).sort());
       },
      // 定义一个函数,用来在数组中查找对象的索引
        findIndex: function (arr, obj) {
            return arr.findIndex(item => ArgsObj.isEqual(item, obj));
        },
        moveUp: function (oldList, newList, attr, id) {//oldList是指所有数据,newList是指选中的数据,attr是属性,id这里没有用到可以省略
            var arr = [];
            var index = 0;
            var argsArrIndex = [];//这个存放的是移动后,选中的数据的下表
            newList = oldList.filter(item => newList.some(newItem => item[attr] === newItem[attr]));
            var indexes = newList.map(item => ArgsObj.findIndex(oldList, item));
            //超出边界
            if (indexes.some(value => (value == 0)) && ArgsObj.isContinuousArray(indexes)) {
                return;
            }
            if (indexes.some(value => value > 0)) {
                oldList.forEach(item => { item.LAY_CHECKED = false; });
                    //多条数据进行上移
                    indexes.forEach(index => {
                        if (index > 0) {
                            var temp = oldList[index];
                            oldList[index] = oldList[index - 1];
                            oldList[index - 1] = temp;
                            if (attr == 'Name') {
                                oldList[index - 1].LAY_CHECKED = true;
                            } else {
                                argsArrIndex.push((index - 1));
                            }
                        }
                        else {
                            if (index == 0) {
                                argsArrIndex.push((index));
                            }
                            oldList[index].LAY_CHECKED = true;
                        }
                    });
              }
            if (attr == 'Name') {//数据源排序
                table.reload(id, {
                    data: oldList
                });
            }
            else {//参数排序
                var getTpl = $("#dataInfo").html();
                laytpl(getTpl).render($.extend([], oldList), function (html) {
                    $(".dataInfo").html(html);

                    form.render();//注意:这里一定要先渲染,再进行选中渲染
                    argsArrIndex.forEach((val) => {
                        $(".choose" + val).find('div').addClass('layui-form-checked');
                    })
                });
            }
        },
        moveDown: function (oldList, newList, attr, id) {
            var argsArrIndex = [];
            var list = [];
            list = oldList;
            newList = oldList.filter(item => newList.some(newItem => item[attr] === newItem[attr]));
            var indexes = newList.map(item => ArgsObj.findIndex(oldList, item));

            if (indexes.some(value => value > -1)) {
                //超出边界
                if (indexes.some(value => (value == oldList.length - 1)) && ArgsObj.isContinuousArray(indexes)) {
                    return;
                }
                oldList.forEach(item => { item.LAY_CHECKED = false; });
                //多条数据进行下移
                indexes.reverse().forEach(index => {
                    if (index >-1 && index < oldList.length -1) {
                        var temp = oldList[index];
                        oldList[index] = oldList[index+1];
                        oldList[index+1] = temp;

                        let checked = oldList[index].LAY_CHECKED;
                        oldList[index].LAY_CHECKED = oldList[index+1].LAY_CHECKED;
                        oldList[index+1].LAY_CHECKED = checked;
                        if (attr == 'Name') {
                            oldList[index + 1].LAY_CHECKED = true;
                        }
                        else {
                            argsArrIndex.push((index + 1));
                        }
                    }
                    else {
                        if (index == oldList.length-1) {
                            argsArrIndex.push((index));
                        }
                        oldList[index].LAY_CHECKED = true;
                    }
                });
            } 
           
            if (attr == 'Name') {//数据源排序
                table.reload(id, {
                    data: oldList
                });
            } else {//参数排序
                var getTpl = $("#dataInfo").html();
                laytpl(getTpl).render($.extend([], list), function (html) {
                    $(".dataInfo").html(html);
                    form.render();
                    argsArrIndex.forEach((val) => {
                        $(".choose" + val).find('div').addClass('layui-form-checked');
                    })
                });
            }
        },
         // 使用 JS 判断数组是否是个连续的数组
       isContinuousArray:function (arr) {
        // 对数组进行升序排序
        arr.sort((a, b) => a - b);
        // 遍历数组
        for (let i = 0; i < arr.length - 1; i++) {
            if (arr[i + 1] - arr[i] !== 1) {
                return false;
            }
        }
        return true;
    },

由于我的功能有两处需要这个操作,考虑到代码的简洁性和复用性以及可扩展性,把代码封装成若干个函数,方便调用。

三、效果图

以下只展示了下移操作。

对于树形表格数据,通常可以通过拖拽节点的方式来实现上移下移操作。如果需要通过按钮来实现上移下移操作,可以参考以下步骤: 1. 首先,需要获取当前选中节点的数据以及它的父节点数据。 2. 然后,根据上移下移的操作,确定需要调整的节点位置和目标位置。 3. 最后,通过操作数据源,将节点数据移动到目标位置即可。注意要考虑节点在同一级别或不同级别的情况。 以下是一个示例代码,用于实现树形表格数据上移下移操作: ```javascript // 获取当前选中节点数据和父节点数据 const currentNode = treeGrid.getSelectedNode(); const parentNode = treeGrid.getParentNode(currentNode); // 获取当前节点在父节点下的位置 const currentIndex = parentNode.children.indexOf(currentNode); // 上移操作 if (moveUp) { // 确定目标位置 const targetIndex = currentIndex - 1; // 如果当前节点和目标节点在同一级别 if (currentNode.parent === parentNode && targetIndex >= 0) { // 移动节点数据到目标位置 parentNode.children.splice(targetIndex, 0, parentNode.children.splice(currentIndex, 1)[0]); } else if (currentNode.parent !== parentNode && targetIndex >= 0) { // 如果当前节点和目标节点不在同一级别,需要移动到目标节点的子节点中 parentNode.children[targetIndex].children.push(currentNode); currentNode.parent.children.splice(currentIndex, 1); } } // 下移操作 if (moveDown) { // 确定目标位置 const targetIndex = currentIndex + 1; // 如果当前节点和目标节点在同一级别 if (currentNode.parent === parentNode && targetIndex < parentNode.children.length) { // 移动节点数据到目标位置 parentNode.children.splice(targetIndex, 0, parentNode.children.splice(currentIndex, 1)[0]); } else if (currentNode.parent !== parentNode && targetIndex < parentNode.children.length) { // 如果当前节点和目标节点不在同一级别,需要移动到目标节点的子节点中 parentNode.children[targetIndex].children.unshift(currentNode); currentNode.parent.children.splice(currentIndex, 1); } } // 刷新表格数据 treeGrid.loadData(treeData); ``` 需要注意的是,上移下移操作的具体实现方式可能会因为数据结构和需求的不同而有所不同。以上代码仅供参考。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值