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);
相关推荐
程序员小张丶3 分钟前
基于React Native开发HarmonyOS 5.0主题应用技术方案
javascript·react native·react.js·主题·harmonyos5.0
Captaincc6 分钟前
Ilya 现身多大毕业演讲:AI 会完成我们能做的一切
前端·ai编程
teeeeeeemo18 分钟前
Vue数据响应式原理解析
前端·javascript·vue.js·笔记·前端框架·vue
Sahas101922 分钟前
__VUE_PROD_HYDRATION_MISMATCH_DETAILS__ is not explicitly defined.
前端·javascript·vue.js
Jinxiansen021132 分钟前
Vue 3 实战:【加强版】公司通知推送(WebSocket + token 校验 + 心跳机制)
前端·javascript·vue.js·websocket·typescript
MrSkye33 分钟前
React入门:组件化思想?数据驱动?
前端·react.js·面试
BillKu42 分钟前
Java解析前端传来的Unix时间戳
java·前端·unix
@Mr_LiuYang42 分钟前
网页版便签应用开发:HTML5本地存储与拖拽交互实践
前端·交互·html5·html5便签应用
JohnYan1 小时前
Bun技术评估 - 05 SQL
javascript·后端·bun
JacksonGao1 小时前
一分钟带你了解React Fiber的工作单元结构!
前端·react.js