Изменение имени ключа в объекте 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
}