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);
相关推荐
还是大剑师兰特40 分钟前
D3的竞品有哪些,D3的优势,D3和echarts的对比
前端·javascript·echarts
王解41 分钟前
【深度解析】CSS工程化全攻略(1)
前端·css
一只小白菜~1 小时前
web浏览器环境下使用window.open()打开PDF文件不是预览,而是下载文件?
前端·javascript·pdf·windowopen预览pdf
方才coding1 小时前
1小时构建Vue3知识体系之vue的生命周期函数
前端·javascript·vue.js
man20171 小时前
【2024最新】基于springboot+vue的闲一品交易平台lw+ppt
vue.js·spring boot·后端
阿征学IT1 小时前
vue过滤器初步使用
前端·javascript·vue.js
王哲晓1 小时前
第四十五章 Vue之Vuex模块化创建(module)
前端·javascript·vue.js
丶21361 小时前
【WEB】深入理解 CORS(跨域资源共享):原理、配置与常见问题
前端·架构·web
发现你走远了1 小时前
『VUE』25. 组件事件与v-model(详细图文注释)
前端·javascript·vue.js
Mr.咕咕1 小时前
Django 搭建数据管理web——商品管理
前端·python·django