var addObjectResponse = [{
'SPO2': '222.00000',
'VitalGroupID': 1152,
'Temperature': 36.6666666666667,
'DateTimeTaken': '/Date(1301494335000-0400)/',
'UserID': 1,
'Height': 182.88,
'UserName': 'Admin',
'BloodPressureDiastolic': 80,
'Weight': 100909.090909091,
'TemperatureMethod': 'Oral',
'Resprate': 111,
'HeartRate': 111,
'BloodPressurePosition': 'Standing',
'VitalSite': 'Popliteal',
'VitalID': 1135,
'Laterality': 'Right',
'HeartRateRegularity': 'Regular',
'HeadCircumference': '',
'BloodPressureSystolic': 120,
'CuffSize': 'XL',
}];
如何重命名键......就像SPO2进入O2 ......数组中有这么多对象......
答案 0 :(得分:17)
也许是这样的?
var i, len = addObjectResponse.length;
for (i = 0; i < len; i++) {
addObjectResponse[i]['O2'] = addObjectResponse[i]['SPO2'];
delete addObjectResponse[i]['SPO2'];
}
或
addObjectResponse = addObjectResponse.map(function (obj) {
obj['O2'] = obj['SP02'];
delete obj['S02'];
return obj;
});
或
for (let obj of addObjectResponse) {
obj['O2'] = obj['SP02'];
delete obj['S02'];
}
或
function renameProperty(obj, fromKey, toKey) {
obj[toKey] = obj[fromKey];
delete obj[fromKey];
}
addObjectResponse.forEach(obj => renameProperty(obj, 'SP02', 'O2'));
答案 1 :(得分:11)
您无法直接重命名属性。但是,您可以设置新属性并取消设置旧属性,间接“重命名”它们:
function rename(obj, oldName, newName) {
if(!obj.hasOwnProperty(oldName)) {
return false;
}
obj[newName] = obj[oldName];
delete obj[oldName];
return true;
}
答案 2 :(得分:6)
这可能不是重命名密钥的最有效方法,但我认为它在某些方面很有趣:
如果您创建这样的映射对象:
const m = { SPO2: 'O2' };
然后您将能够轻松添加更多密钥以便在将来重命名。
现在,可以在香草JS中创建一个单行:
const t = o => Object.assign(...Object.keys(o).map(k => ({ [m[k] || k]: o[k] })));
假设你有一个对象数组:
const a = [{
'SPO2': '222.00000',
'VitalGroupID': 1152,
}, {
'SPO2': '333.00000',
'VitalGroupID': 1153,
}, {
'SPO2': '444.00000',
'VitalGroupID': 1154,
}];
您可以使用a.map(t)
这样的新数组:
console.log('Before:', a);
console.log('After:', a.map(t));
您的原始对象在原始数组中仍然完好无损。
答案 3 :(得分:1)
好的,所以你在这里做了两件事,遍历数组并重命名对象的属性。
首先,一般来说,你应该使用数组map()
function。
我认为它比使用for ( .. )
循环更容易出错,而且比forEach()
稍微好一些。
for ( .. )
循环通常会为您提供更好的性能(取决于JS引擎),但您需要处理相当大的数组才能注意到(即,对于100k元素可能有大约10ms的差异)。
其次,要重命名对象属性,显而易见的解决方案是只设置新密钥并删除旧密钥。
这将起作用,但如果定义了自定义getter或setter,则不会总是为您提供与旧的属性完全相同的属性。
如果您正在创建一个通用辅助函数来完成这种工作,那么最好使用它
Object.defineProperty()
和
Object.getOwnPropertyDescriptor()
将这些放在一起我们得到:
function renameKeyInObjArray (array, oldKey, newKey) {
return array.map(function (obj) {
Object.defineProperty(obj, newKey, Object.getOwnPropertyDescriptor(obj, oldKey));
delete obj[oldKey];
return obj;
});
}
// Use our new function to process the array
renameKeyInObjArray(addObjectResponse, 'SPO2', 'O2');
此函数通过引用更新数组的内容,并返回对数组的引用,因此可以链接。它也是用ES5.1语法编写的,所以应该在任何地方运行。
答案 4 :(得分:1)
这里是处理一组对象并将旧对象键映射到新对象键的映射。
我主要从here复制了非常好的代码,只是使它可以在对象数组而不是单个对象上运行。
代码
const renameKeys = (keysMap, objArr) =>
(renamedArr = objArr.map((obj) =>
Object.keys(obj).reduce(
(acc, key) => ({
...acc,
...{ [keysMap[key] || key]: obj[key] },
}),
{}
)
));
示例
renameKeys({ tWo: 'two', FreE: 'three' }, [
{ one: 1, tWo: 2, three: 3 },
{ one: 100, two: 200, FreE: 300 },
]);
[ { one: 1, two: 2, three: 3 }, { one: 100, two: 200, three: 300 } ]
答案 5 :(得分:0)
addObjectResponse[0]["O2"] = addObjectResponse[0]["SPO2"];
addObjectResponse[0]["SP02"] = null;
[0]是必要的,因为addObjectResponse被设置为包含一个元素的数组,该元素包含一个对象。您对将要重命名的密钥或方式有任何规则吗?
编辑:我误解了OP,认为“很多对象”指的是对象中需要重命名的许多键,而不是数组中的每个对象需要重命名一个键。
答案 6 :(得分:0)
您可以添加+ delete(阅读IE警告);
var addObjectResponse = [{
'SPO2': '222.00000',
'VitalGroupID': 1152
}]
for (var k in addObjectResponse[0])
log(k)
>>SPO2
>>VitalGroupID
addObjectResponse[0]['O2'] = addObjectResponse[0]['SPO2']
delete addObjectResponse[0]['SPO2']
for (var k in addObjectResponse[0])
log(k)
>>VitalGroupID
>>O2
答案 7 :(得分:0)
我创建了一个很好的函数来重命名属性名称:https://github.com/meni181818/simpleCloneJS/blob/master/renameProperties.js
用法:
var renamedObj = renameProperties(sourceObject, {propName: 'propNEWname', anotherPropName: 'anotherPropNEWname'});
我的函数,也处理数组内的对象,所以你可以这样做:
addObjectResponse = renameProperties(addObjectResponse, {SPO2: 'O2'});
function renameProperties(sourceObj, replaceList, destObj) {
destObj = destObj || {};
each(sourceObj, function(key) {
if(sourceObj.hasOwnProperty(key)) {
if(sourceObj[key] instanceof Array) {
if(replaceList[key]) {
var newName = replaceList[key];
destObj[newName] = [];
renameProperties(sourceObj[key], replaceList, destObj[newName]);
} else if(!replaceList[key]) {
destObj[key] = [];
renameProperties(sourceObj[key], replaceList, destObj[key]);
}
} else if(typeof sourceObj[key] === 'object') {
if(replaceList[key]) {
var newName = replaceList[key];
destObj[newName] = {};
renameProperties(sourceObj[key], replaceList, destObj[newName]);
} else if(!replaceList[key]) {
destObj[key] = {};
renameProperties(sourceObj[key], replaceList, destObj[key]);
}
} else {
if(replaceList[key]) {
var newName = replaceList[key];
destObj[newName] = sourceObj[key];
} else if(!replaceList[key]) {
destObj[key] = sourceObj[key];
}
}
}
});
return destObj;
}
在上面函数的第3行,我们使用each()
函数。这就是:
function each(objOrArr, callBack) {
if(objOrArr instanceof Array) {
for(var i = 0; i < objOrArr.length; i++) {
callBack(i);
}
} else if(typeof objOrArr === 'object') {
for(var prop in objOrArr) {
// if the property really exist
if(objOrArr.hasOwnProperty(prop)) {
callBack(prop);
}
}
}
}
注意:如果您使用的是Jquery OR underscore.js或其他具有&#39; each()&#39;功能,你可以使用它。只需添加$.each
(jquery)或_.each
(underscore.js)。
答案 8 :(得分:0)
这里的游戏有点晚了,但是这样的事情怎么样:
const newAddObjectResponse = addObjectResponse.map((obj) => {
const {SPO2: O2, ...rest} = obj
return {O2, ...rest}
})
如果你想替换你原来的数组,那么你可以这样做:
let addObjectResponse = [
{
SPO2: '222.00000',
VitalGroupID: 1152,
Temperature: 36.6666666666667,
DateTimeTaken: '/Date(1301494335000-0400)/',
UserID: 1,
Height: 182.88,
UserName: 'Admin',
BloodPressureDiastolic: 80,
Weight: 100909.090909091,
TemperatureMethod: 'Oral',
Resprate: 111,
HeartRate: 111,
BloodPressurePosition: 'Standing',
VitalSite: 'Popliteal',
VitalID: 1135,
Laterality: 'Right',
HeartRateRegularity: 'Regular',
HeadCircumference: '',
BloodPressureSystolic: 120,
CuffSize: 'XL',
},
]
addObjectResponse = addObjectResponse.map((obj) => {
const {SPO2: O2, ...rest} = obj
return {O2, ...rest}
})