重命名对象中的键

时间:2011-08-04 13:18:14

标签: javascript

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 ......数组中有这么多对象......

9 个答案:

答案 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)

在vanilla JS one-liner

中的不可变键重命名

这可能不是重命名密钥的最有效方法,但我认为它在某些方面很有趣:

  1. 它不会改变原始对象
  2. 需要一行vanilla JavaScript
  3. 它演示了现代语法的使用
  4. 如果您仍需要使用原始阵列,有时可能需要No.1。 考虑到这里的一些示例具有超过30行代码的事实,No.2可能是有趣的。 No.3可能用于教育目的,以说明语言的一些特征,这些特征并非经常使用,考虑到它们的强大程度和广泛支持的事实。

    如果您创建这样的映射对象:

    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'});

DEMO


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}
})