Переименовать ключи в объекте

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... в массиве так много объектов...

10 ответов

Может как то так?

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

Вы не можете напрямую переименовать свойства. Однако вы можете установить новые свойства и сбросить старые, косвенно "переименовав" их:

function rename(obj, oldName, newName) {
    if(!obj.hasOwnProperty(oldName)) {
        return false;
    }

    obj[newName] = obj[oldName];
    delete obj[oldName];
    return true;
}

Переименование неизменяемого ключа в одной ванили JS

Возможно, это не самый эффективный способ переименования ключа, но я думаю, что он интересен определенными способами:

  1. Это не мутирует оригинальные объекты
  2. Требуется одна строка ванильного JavaScript
  3. Это демонстрирует использование современного синтаксиса

Иногда может понадобиться номер 1, если вам все еще нужно использовать исходный массив. № 2 может быть интересным, учитывая тот факт, что некоторые примеры здесь имеют более 30 строк кода. № 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));

Ваши оригинальные объекты по-прежнему не повреждены в исходном массиве.

Я создал хорошую функцию для переименования имен свойств: 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 ИЛИ underscore.js или другую библиотеку с функцией 'each()', вы можете использовать ее вместо этого. просто повторить $.each (JQuery) или _.each (underscore.js).

Итак, здесь вы делаете две вещи: перебираете массив и переименовываете свойства объекта.

Во-первых, чтобы использовать его, обычно следует использовать массивы. map() функция Это менее подвержено ошибкам, чем использование for ( .. ) петля и немного приятнее, чем forEach(), Я думаю. for ( .. ) Цикл обычно дает вам лучшую производительность (в зависимости от движка JS), но вам нужно иметь дело с довольно массивным массивом, чтобы заметить (то есть, может быть, разница ~10 мс для элементов 100k).

Во-вторых, для переименования свойства объекта очевидным решением будет просто установить новый ключ и удалить старый. Это будет работать, но не всегда даст вам свойства, которые ведут себя точно так же, как старые, если пользовательский геттер или сеттер были определены. Если вы создаете универсальную вспомогательную функцию для выполнения такой работы, вам лучше использовать 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, поэтому должен работать практически везде.

Вот тот, который работает с массивом объектов и сопоставляет ключи старых объектов с ключами новых объектов.

Я в основном скопировал отсюда очень хороший код и просто заставил его работать с массивами объектов, а не с одним.

Код

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 } ]
 addObjectResponse[0]["O2"] = addObjectResponse[0]["SPO2"];
 addObjectResponse[0]["SP02"] = null;

[0] необходимо, потому что addObjectResponse установлен в массив с одним элементом, который содержит объект. Есть ли у вас какие-либо правила относительно того, какие ключи будут переименованы или как?

Редактировать: я неправильно понял OP, думая, что "многие объекты" ссылаются на множество ключей в объекте, которые должны быть переименованы, в отличие от многих объектов в массиве, каждый из которых должен иметь один ключ переименован.

Вместо того, чтобы переименовывать этот ключ объекта, вы можете создать другой объект с собственными именами, например так:

var obj={wrongKeyName:'test'};
var obj2 = {}
obj2.rightKeyName = obj.wrongKeyName;
console.log(obj2);

Немного поздно к игре, но как насчет чего-то вроде этого:

      const newAddObjectResponse = addObjectResponse.map((obj) => {
    const {SPO2: O2} = obj
    return {O2, ...obj}
})

Вы можете добавить + удалить (читайте предостережение 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
Другие вопросы по тегам