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);
相关推荐
Carry34513 分钟前
不清楚的 .gitignore
前端·git
张鑫旭20 分钟前
AI时代2025年下半年学的这些Web前端特性有没有用?
前端·ai编程
pinkQQx21 分钟前
H5唤醒APP技术方案入门级介绍
前端
Lefan24 分钟前
UniApp 隐私合规神器!一键搞定应用市场审核难题 - lf-auth 隐私合规助手
前端
Null15524 分钟前
浏览器唤起桌面端应用(进阶篇)
前端·浏览器
Jing_Rainbow27 分钟前
【Vue-2/Lesson62(2025-12-10)】模块化与 Node.js HTTP 服务器开发详解🧩
前端·vue.js·node.js
风度前端1 小时前
用了都说好的 uniapp 路由框架
前端
冴羽1 小时前
2026 年 Web 前端开发的 8 个趋势!
前端·javascript·vue.js
码银1 小时前
ruoyi的前端(vue)新增的时候给字典设置默认值 但不能正常
前端
五仁火烧2 小时前
Vue3 项目的默认端口行为
服务器·vue.js·nginx·容器·vue