Изменение имени ключа в объекте JavaScript
Я проверяю атрибуты в объекте JavaScript, заменяя некоторые ключи, удаляя префикс "element" и сохраняя новые значения в другом объекте.
var keys = Object.keys(json);
for (var j=0; j < keys.length; j++) {
key = keys[j].replace("element_", "");
switch(key) {
default :
tmp[key] = json[key];
break;
}
}
Дело в том, что когда я это делаю, я могу записывать все ключи, у них есть правильные имена, но когда я пытаюсь установить значения, связанные с этими ключами, они undefined (json [key]).
Это связано с тем, что я преобразовал ключи (Objects
) в Strings
(с помощью метода replace
)?
Ответы
Ответ 1
Проблема заключается в том, что вы ищете свойство в исходном объекте с помощью нового ключа. Используйте keys[j]
вместо key
:
var keys = Object.keys(json);
for (var j=0; j < keys.length; j++) {
var key = keys[j].replace(/^element_/, "");
tmp[key] = json[keys[j]];
}
Я использую регулярное выражение в замене, так что ^
может соответствовать началу строки. Таким образом, он заменяет строку только тогда, когда она является префиксом, и не включает, например, noexample_data
в no_data
.
Примечание. То, что у вас есть, не "json", это объект JavaScript. JSON - текстовый формат для представления данных.
Это связано с тем, что я преобразовал ключи (объекты) в строки (с методом замены)?
Нет. Ключами являются строки, а не объекты.
Вы также можете изменить свойства в исходном объекте, удалив старые и добавив новое:
var keys = Object.keys(json);
for (var j=0; j < keys.length; j++) {
if (keys[j].indexOf("element_") == 0) {
json[keys[j].substr(8)] = json[keys[j]];
delete json[keys[j]];
}
}
Ответ 2
Мы напишем небольшую функцию, чтобы исправить ключ так, как вы хотите.
function fix_key(key) { return key.replace(/^element_/, ''); }
Подчеркивание
_.object(
_.map(_.keys(json), fix_key),
_.values(json)
)
ES5/цикл
var keys = Object.keys(json);
var result = {};
for (i = 0; i < keys.length; i++) {
var key = keys[i];
result[fix_key(key)] = json[key];
}
return result;
ES5/уменьшить
Object.keys(json) . reduce(function(result, key) {
result[fix_key(key)] = json[key];
return result;
}, {});
ES6
Object.assign(
{},
...Object.keys(json) .
map(key => ({[fix_key(key)]: json[key]}))
)
Это делает массив маленьких объектов, каждый из которых имеет одну пару "ключ-значение", используя функцию "вычисленное свойство" ES6, а затем передает их на Object.assign
с помощью "расширенного" оператора ES6, который объединяет их.
Ответ 3
key
не является оригинальным json
, потому что вы удаляете префикс element_
var keys = Object.keys(json);
for (var j=0; j < keys.length; j++) {
key = keys[j].replace("element_", "");
var _key = keys[j];
switch(key) {
default :
tmp[key] = json[_key];
break;
}
}
Ответ 4
Попробуйте следующее:
var keys = Object.keys(json);
for (var j=0; j < keys.length; j++) {
var key = keys[j]; // key
var value = json[key]; // data
delete json[key]; // deleting data with old key
key = key.replace("element_", ""); // renaming key
json[key] = value; // setting data with new key
}