在数据渲染中, 前端的属性名和后端返回的数据的属性名不一致,这时就涉及属性重命名
基本的修改对象属性名
将属性名id修改为value, name修改label
const data = {
id: 1,
name: 'aime'
}
// id => value, name => label
data.value = data.id
data.label = data.name
如果重命名后,不需要保留原来的属性,可以使用 操作符delete 进行删除
...
data.value = data.id
data.label = data.name
// 删除原来的属性
delete data.id
delete data.name
封装-对象属性名
如果多处都需要修改属性名,这时考虑将其封装为一个方法中,方便使用
/**
* 重命名对象的属性名
* obj 对象
* map 旧属性:新属性 的映射关系
* keepOldProp 是否保留旧属性, 默认会删除原来的属性,如果需要保留原属性,请传递true
*/
const renameObjProp = (obj, map = {}, keepOldProp) => {
if (!isEmpty(map)) {
for (let prop in map) {
const oldProp = prop
const newProp = map[prop]
replace(obj, oldProp, newProp, keepOldProp)
}
}
function replace(o, oldProp, newProp, keepOldProp) {
if (o.hasOwnProperty(oldProp)) {
o[newProp] = o[oldProp]
if (!keepOldProp) {
delete o[oldProp]
}
}
}
}
// 判断是否为空
const isEmpty = value => {
if (value === null || value === '' || value === undefined) {
return true
}
if (Array.isArray(value)) {
return value.length === 0
}
if (typeof value === 'object') {
return Object.keys(value).length === 0
}
return false
}
module.exports = {
renameObjProp
}
使用
// 导入,根据你的实际路径填写
import { renameObjProp } from '../../utils/util.js'
clickRename () {
const data = {
id: 1,
name: 'aime',
age: 20
}
renameObjProp(data, {
name: "label",
id: "value"
})
// 处理后 {age: 20, label: "aime", value: 1}
console.log(data)
}
保留原有属性keepOldProp = true
renameObjProp(data, {
name: "label",
id: "value"
}, true)
// {id: 1, name: "aime", age: 20, label: "aime", value: 1}
console.log(data)
修改数组中对象的属性名
当然有时候数据是一个数组对象,一个个修改太麻烦,使用循环即可解决,大体如下
/**
* 批量重命名数组中对象的属性名
* arr 数组
* map 旧属性:新属性 的映射关系
* keepOldProp 是否保留旧属性
*/
const renameProp = (arr, map, keepOldProp) => {
if (!isEmpty(arr)) {
arr.forEach(o => {
renameObjProp(o, map, keepOldProp)
})
}
}
使用和上面类似,导入renameProp即可直接使用
完整的
/**
* 批量重命名数组中对象的属性名
* arr 数组
* map 旧属性:新属性 的映射关系
* keepOldProp 是否保留旧属性
*/
const renameProp = (arr, map, keepOldProp) => {
if (!isEmpty(arr)) {
arr.forEach(o => {
renameObjProp(o, map, keepOldProp)
})
}
}
const renameObjProp = (obj, map = {}, keepOldProp) => {
if (!isEmpty(map)) {
for (let prop in map) {
const oldProp = prop
const newProp = map[prop]
replace(obj, oldProp, newProp, keepOldProp)
}
}
function replace(o, oldProp, newProp, keepOldProp) {
if (o.hasOwnProperty(oldProp)) {
o[newProp] = o[oldProp]
if (!keepOldProp) {
delete o[oldProp]
}
}
}
}
module.exports = {
renameProp,
renameObjProp
}