网上大多是利用JSON转为字符串再进行替换修改属性名
var bbb = JSON.parse(JSON.stringify(aaa).replace(/Name/g,"title"));
这样做会有2个缺点,1.如果属性值匹配到会被更改 2.属性名中有部分匹配到也会被更改 如下:
var aaa = [
{
Name:"test1Name",
type: "test",
},
{
Name:"test2",
model: "model2"
}
]
var bbb = JSON.parse(JSON.stringify(aaa).replace(/Name/g,"title"));
结果如下,属性值也被修改。
不改变键值也不匹配部分键名只匹配你要改的键名
var aaa = [
{
Name:"test1Name",
type: "test",
},
{
Name:"test2",
model: "model2"
}
]
var copyTrans = function(obj, typeArr) {
let result;
let toString = Object.prototype.toString;
if(toString.call(obj) === '[object Array]'){
result = [];
for(let i = 0; i < obj.length; i++){
result[i] = copyTrans(obj[i], arguments[1])
}
}else if(toString.call(obj) === '[object Object]'){
result = {};
for (let _key in obj) {
if (obj.hasOwnProperty(_key)) {
let flag = 0, _value = null;
for (let j = 0; j < arguments[1].length; j ++) {
if (arguments[1][j].key === _key) {
flag = 1;
_value = arguments[1][j].value
}
}
if (flag)
result[_value] = copyTrans(obj[_key], arguments[1])
else
result[_key] = copyTrans(obj[_key], arguments[1])
}
}
}else{
return obj
}
return result
};
//将aaa对象中的type键改为chilren、model键改为chilren
console.log(copyTrans(aaa, [{ key: "type", value: "chilren" }, { key: "model", value: "chilren" }]));
函数第一个参数是要修改的对象,第二个参数传数组 key为要被改的属性名, value为改成的属性名。函数本身是一个深拷贝,通过对其每层中对象的“键”做匹配替换即实现了多层的“键”替换,另外这里如果传空数组此函数就是一个深拷贝。