递归实现对象数组属性名的替换

简介: 递归实现对象数组属性名的替换

使用场景:


使用的layui 树形组件,这个组件需要一个数据源,名称显示默认是title,而后台返回的数据对应项为name,所以想把后台返回数据中的name换成title。于是封装了一个方法,可以随意的替换我们想要替换的属性名

修改之前的数据是:


const packages = [
  {
    id: '641a1690-6c8b-4ada-ae97-8d82cc4fe7a3',
    name: 'com.sample',
    children: {
      id: 'd7384f60-e4ab-4a86-8e2e-0f66cc32f',
      name: 'child.computer.com',
      children: { id: 'e4ab-4a86-0f66cc32f560', name: 'child.com' }
    }
  },
  { id: 'd7384f60-e4ab-4a86-8e2e-0f66cc32f560', name: 'computer.com' },
  { id: 'ca7f972e-64ee-4cb0-80b9-1036fac69d32', name: 'java.util' }
];

想要的效果是:


{
    key: '641a1690-6c8b-4ada-ae97-8d82cc4fe7a3',
    title: 'com.sample',
    children: {
      key: 'd7384f60-e4ab-4a86-8e2e-0f66cc32f',
      title: 'child.computer.com',
      children: { key: 'e4ab-4a86-0f66cc32f560', title: 'child.com' }
    }   
}

实现的方法:递归实现


检查来自Object#entries()调用的[key-value]对的值是否为对象。

如果是这样,请再次递归调用transformObj函数以获取该值。否则按原样返回值。

最后使用[key-value]将[key-value]对数组转换回一个对象:

const packages = [{ id: '641a1690-6c8b-4ada-ae97-8d82cc4fe7a3', name: 'com.sample', children: { id: 'd7384f60-e4ab-4a86-8e2e-0f66cc32f', name: 'child.computer.com', children: { id: 'e4ab-4a86-0f66cc32f560', name: 'child.com' }}}, { id: 'd7384f60-e4ab-4a86-8e2e-0f66cc32f560', name: 'computer.com' }, { id: 'ca7f972e-64ee-4cb0-80b9-1036fac69d32', name: 'java.util' }];
const replacer = { "id": "key", "name" :"title"};
const transformObj = (obj) => {
  if(obj && Object.getPrototypeOf(obj) === Object.prototype){
    return Object.fromEntries(
    Object.entries(obj)
          .map(([k, v]) => [replacer[k] || k, transformObj(v)])
    );
  }
  //Base case, if not an Object literal return value as is
  return obj;
}
console.log(packages.map(o => transformObj(o)));
相关文章
|
10月前
根据数组中对象的属性值进行排序
根据数组中对象的属性值进行排序
65 0
|
10月前
|
存储 机器学习/深度学习 Java
【JavsSE】数组的定义与使用
【JavsSE】数组的定义与使用
|
11月前
对象定义-解构-枚举属性遍历以及对象内函数
对象定义-解构-枚举属性遍历以及对象内函数
51 0
|
12月前
|
C++ 容器
C++ vector 赋值、删除、排序类之外的其他函数
C++ vector 赋值、删除、排序类之外的其他函数
78 0
|
存储 C语言
数组的声明,定义,访问,循环遍历
int 表示该数组用来装 int 类型的元素,其他的形式就写其他的,例如:double [10]; a 是数组名字,是合法的c语言标识符即可; [ ] 是指示的作用,表示变量 a 是数组变量; 若没有[ ], 就是普通的整型变量。 10 表示该数组最多装10个int 类型数据,个数自定。
76 0
lodash创建自身可枚举属性的值为数组
lodash创建自身可枚举属性的值为数组
65 0
lodash创建自身和继承的可枚举属性的值为数组
lodash创建自身和继承的可枚举属性的值为数组
66 0
求字符串的长度(4种写法)(普通写法,函数写法(两种:有无返回值),不允许创建临时变量法(递归))
求字符串的长度(4种写法)(普通写法,函数写法(两种:有无返回值),不允许创建临时变量法(递归))
116 0
求字符串的长度(4种写法)(普通写法,函数写法(两种:有无返回值),不允许创建临时变量法(递归))
|
Java 数据库
java反射机制查找类的属性并赋值
先说一下需求:最近做一个项目其中需要将前台传来的数组存到数据库,但是这个表里有15个字段,集合是不固定的,然后要把这个集合的数值赋给这个类的相应属性,然后存到数据库中。集合长度应小于等于这个类属性的个数。
278 0
|
存储
集合作为函数参数传参时创建新集合对象的作用
易错点——List集合集合作为函数参数传参时创建新集合对象的作用
139 0