JavaScript: объект переименовать ключ
Есть ли умный (то есть оптимизированный) способ переименовать ключ в объекте JavaScript?
Неоптимизированный способ будет:
o[ new_key ] = o[ old_key ];
delete o[ old_key ];
37 ответов
Пробуем использовать преобразование lodash.
var _ = require('lodash');
obj = {
"name": "abc",
"add": "xyz"
};
var newObject = _.transform(obj, function(result, val, key) {
if (key === "add") {
result["address"] = val
} else {
result[key] = val
}
});
console.log(obj);
console.log(newObject);
После поиска многих ответов это лучшее решение для меня:
const renameKey = (oldKey, newKey) => {
_.reduce(obj, (newObj, value, key) => {
newObj[oldKey === key ? newKey : key] = value
return newObj
}, {})
}
Вместо замены исходного ключа он конструирует новый объект, это понятно. Способ в вопросе работал, но изменит порядок объекта, потому что он добавляет новый ключ-значение к последнему.
Как правило, если вы хотите получить новый объект (без изменения исходного) с ключами, переименованными в соответствии сkeyMap
- вы можете использовать следующую реализацию на основе lodashmapKeys
:
const {mapKeys} = require('lodash');
const renameKeys = (obj, keyMap) => _.mapKeys(obj, (value, key) => keyMap[key] || key);
Пример использования:
renameKeys({a: 1, b: 2, c: 3}, {c: 'p', a: 'm'})
> {m: 1, b: 2, p: 3}
function iterate(instance) {
for (let child of instance.tree_down) iterate(child);
instance.children = instance.tree_down;
delete instance.tree_down;
}
iterate(link_hierarchy);
console.log(link_hierarchy);
Будет ли проблема просто сделать это?
someObject = {...someObject, [newKey]: someObject.oldKey}
delete someObject.oldKey
Что можно было бы обернуть в функцию, если хотите:
const renameObjectKey = (object, oldKey, newKey) => {
// if keys are the same, do nothing
if (oldKey === newKey) return;
// if old key doesn't exist, do nothing (alternatively, throw an error)
if (!object.oldKey) return;
// if new key already exists on object, do nothing (again - alternatively, throw an error)
if (object.newKey !== undefined) return;
object = { ...object, [newKey]: object[oldKey] };
delete object[oldKey];
return { ...object };
};
// in use
let myObject = {
keyOne: 'abc',
keyTwo: 123
};
// avoids mutating original
let renamed = renameObjectKey(myObject, 'keyTwo', 'renamedKey');
console.log(myObject, renamed);
// myObject
/* {
"keyOne": "abc",
"keyTwo": 123,
} */
// renamed
/* {
"keyOne": "abc",
"renamedKey": 123,
} */
const data = res
const lista = []
let newElement: any
if (data && data.length > 0) {
data.forEach(element => {
newElement = element
Object.entries(newElement).map(([key, value]) =>
Object.assign(newElement, {
[key.toLowerCase()]: value
}, delete newElement[key], delete newElement['_id'])
)
lista.push(newElement)
})
}
return lista
Если вы хотите сохранить тот же порядок объекта
changeObjectKeyName(objectToChange, oldKeyName: string, newKeyName: string){
const otherKeys = cloneDeep(objectToChange);
delete otherKeys[oldKeyName];
const changedKey = objectToChange[oldKeyName];
return {...{[newKeyName] : changedKey} , ...otherKeys};
}
Как использовать:
changeObjectKeyName ( {'a' : 1}, 'a', 'A');