Есть ли умный (то есть оптимизированный) способ переименовать ключ в объекте JavaScript?
Неоптимизированный способ будет:
o[ new_key ] = o[ old_key ];
delete o[ old_key ];
javascript
object
key
rename
Жан Винсент
источник
источник
Ответы:
Я полагаю, что наиболее полный (и правильный) способ сделать это:
Этот метод гарантирует, что переименованное свойство ведет себя идентично исходному.
Кроме того, мне кажется, что возможность обернуть это в функцию / метод и поместить его в
Object.prototype
не имеет отношения к вашему вопросу.источник
if (old_key !== new_key)
на:if (old_key !== new_key && o[old_key])
Вы можете обернуть работу в функцию и назначить ее
Object
прототипу. Возможно, используйте свободный стиль интерфейса, чтобы сделать несколько переименований потоком.ECMAScript 5 специфический
Хотелось бы, чтобы синтаксис не был таким сложным, но было бы неплохо иметь больше контроля.
источник
Object.defineProperty
.hasOwnProperty
для проверки свойств и внутриfor ... in
циклов, то почему это имеет значение, если мы расширяем Object?Если вы изменяете исходный объект, ES6 может сделать это в одну строку.
Или две строки, если вы хотите создать новый объект.
источник
[]
вокруг квадратная скобкаnewKey
? Решение работает без этого на самом деле.Если кому-то нужно переименовать список свойств:
Использование:
источник
my_object_property
вmyObjectProperty
, однако, если мое свойство было односложным, то ключ был удален. +1Я хотел бы просто использовать
ES6(ES2015)
способ!источник
Если вы не хотите изменять свои данные, рассмотрите эту функцию ...
Подробное объяснение Язида Бзадоу https://medium.com/front-end-hacking/immubly-rename-object-keys-in-javascript-5f6353c7b6dd
источник
Большинство ответов здесь не поддерживают порядок пар ключ-значение JS Object. Например, если на экране имеется форма пар ключ-значение объекта, которую вы хотите изменить, важно сохранить порядок записей объектов.
Способ ES6 циклически проходить через объект JS и заменять пару ключ-значение новой парой с измененным именем ключа будет выглядеть примерно так:
Решение сохраняет порядок записей, добавляя новую запись вместо старой.
источник
Вы можете попробовать lodash
_.mapKeys
.источник
Вариант с использованием объекта деструктуризации и распространения:
источник
Лично, наиболее эффективный способ переименования ключей в объекте без реализации дополнительных тяжелых плагинов и колес:
Вы также можете обернуть его,
try-catch
если ваш объект имеет недопустимую структуру. Работает отлично :)источник
'a'
в{ a: 1, aa: 2, aaa: 3}
или попытаться переименовать объект со значениями, которые ничего больше строк или чисел или булевыми, или попробовать с циклическими ссылками.Чтобы добавить префикс к каждому ключу:
источник
Я бы сделал что-то вроде этого:
источник
Я бы сказал, что было бы лучше с концептуальной точки зрения просто оставить старый объект (объект из веб-службы) как есть и поместить нужные значения в новый объект. Я предполагаю, что вы в любом случае извлекаете определенные поля в тот или иной момент, если не на клиенте, то, по крайней мере, на сервере. Тот факт, что вы решили использовать имена полей, которые совпадают с именами из веб-службы, только в нижнем регистре, на самом деле не меняет этого. Итак, я бы посоветовал сделать что-то вроде этого:
Конечно, я делаю здесь всевозможные предположения, которые могут быть неверными. Если это не относится к вам, или если это слишком медленно (не так ли? Я не проверял, но я думаю, что разница уменьшается с увеличением количества полей), пожалуйста, игнорируйте все это :)
Если вы не хотите этого делать, и вам нужно только поддерживать определенные браузеры, вы также можете использовать новые методы получения, чтобы также возвращать «верхний регистр (поле)»: см. Http://robertnyman.com/2009/05/28 / getters-and-setters-with-javascript-code-samples-and-demos / и ссылки на этой странице для получения дополнительной информации.
РЕДАКТИРОВАТЬ:
Невероятно, но это также почти вдвое быстрее, по крайней мере, на моем FF3.5 на работе. Смотрите: http://jsperf.com/spiny001
источник
Хотя это не совсем лучшее решение для переименования ключа, оно предоставляет быстрый и простой способ ES6 переименовать все ключи в объекте, не изменяя данные, которые они содержат.
источник
Некоторые из решений, перечисленных на этой странице, имеют некоторые побочные эффекты:
Вот решение, которое сохраняет положение ключа в том же месте и совместимо с IE9 +, но должно создать новый объект и, возможно, не самое быстрое решение:
Обратите внимание: IE9 может не поддерживать forEach в строгом режиме
источник
Вот пример для создания нового объекта с переименованными ключами.
источник
Еще один способ с самым мощным методом REDUCE .
источник
Это небольшая модификация, которую я сделал для функции pomber; Чтобы иметь возможность взять массив объектов вместо одного объекта, а также вы можете активировать индекс. также «Ключи» могут быть назначены массивом
тест
источник
Ваш путь оптимизирован, на мой взгляд. Но у вас получатся переупорядоченные ключи. Вновь созданный ключ будет добавлен в конце. Я знаю, что вы никогда не должны полагаться на порядок ключей, но если вам нужно сохранить его, вам нужно будет пройти по всем ключам и создать новый объект один за другим, заменив соответствующий ключ во время этого процесса.
Как это:
источник
источник
просто попробуйте в вашем любимом редакторе <3
источник