JS多层嵌套数组属性名替换

一、需求场景

项目使用到layui组件库树形组件,这个组件需要一个数据源属性,名称显示默认是title,而后台返回的数据对应项为name,所以想把后台返回数据中的name换成title。由于是嵌套数组属性名替换的需求,内含未知层级的嵌套,首先想到递归处理,在解决问题中途,又学习了replaceAll()方法,所以本次分享两种解决方法。

模拟后端返回数据

bash 复制代码
let leArr = [{
        id: '1',
        name: '模拟第一层级',
        children: [{
            id: '11',
            name: '模拟第二层级',
            children: [{ id: '111', name: '模拟第三层级' },
            { id: '112', name: '模拟第三层级' }]
        }]
    }];

组件实际需求数据

bash 复制代码
let leArr = [{
        id: '1',
        title: '模拟第一层级',
        children: [{
            id: '11',
            title: '模拟第二层级',
            children: [{ id: '111', title: '模拟第三层级' },
            { id: '112', title: '模拟第三层级' }]
        }]
    }];

二、解决方法

1、递归实现

  • 封装递归方法,循环数据,判断children存在且存在数据项
  • 通过赋值完成更改属性名,此处可以理解为创建一个新属性title
  • 根据需求选择保留还是删除原属性,本次演示选择保留,具体执行为已注释的代码部分
scss 复制代码
let leArr = [{        id: '1',        title: '模拟第一层级',        children: [{            id: '11',            title: '模拟第二层级',            children: [{ id: '111', title: '模拟第三层级' },            { id: '112', title: '模拟第三层级' }]
        }]
    }];
    // 封装递归
    function leFn(data) {
        data.forEach(item => {
            // 如果该对象有children属性且存在数据项,则递归处理children  
            if (item.children && item.children.length > 0) {
                leFn(item.children);
            }
            // 更改属性名  
            item.title = item.name;
            // 删除原属性(这个操作为可选项,本次选择保留原属性)
            // delete item.name;
        });
    }
    // 调用递归并传入数据为参数
    leFn(leArr);
    console.log(leArr);

2、replaceAll()方法实现

  • JSON.stringify()将数组转换为一个JSON字符串;
  • replaceAll()方法在JSON字符串中查找所有的"name":,并替换为"title":;
  • JSON.parse()将替换后的JSON字符串重新解析。

此方法原属性不会保留,如果有保留属性的需求,建议用第一种

bash 复制代码
let leArr = [{
        id: '1',
        name: '模拟第一层级',
        children: [{
            id: '11',
            name: '模拟第二层级',
            children: [{ id: '111', name: '模拟第三层级' },
            { id: '112', name: '模拟第三层级' }]
        }]
    }];
    let newArr = JSON.parse(JSON.stringify(leArr).replaceAll(`"name":`, `"title":`))
    console.log(newArr);
相关推荐
风骏时光牛马12 分钟前
生成一个AI开源工具体验标题,只需要一个标题,不需要其他的任何文本。
前端
软件派1 小时前
生产动态数据智能风控:阈值判别、趋势预测、异常识别算法工程落地实战
前端·数据库·算法
花开盛夏^.^10 小时前
电脑打开多个浏览器Web窗口占用较大的运行内存的原因
前端·浏览器
Dxy123931021610 小时前
JS DES 加密详解
开发语言·javascript·arcgis
充值内卷10 小时前
我给桌面加了个鱼缸:C++ 写后端,WebView2 里养一座 Three.js 小岛
开发语言·javascript·c++
馒头不想说话11 小时前
实体店老板的24小时AI运营员工,写、剪、发全自动,省下一整个团队工资
前端
椒哥13 小时前
一天被问几十次"允许",我统计了 517 次,然后写了个插件
前端·javascript·github
风骏时光牛马13 小时前
生成一个AI稳定性治理及疑难问题分析标题,只需要一个标题,不需要其他的任何文本。
前端
莫西干式秃头13 小时前
用 AI + threejs 写了个浏览器里的 3D 动作游戏《武来》:砍怪、放技能、开 SU7
前端·人工智能·three.js
kyriewen13 小时前
我测了 6 种防请求竞态的写法:只有 1 种真能打
前端·javascript·程序员