Existe uma maneira inteligente (ou seja, otimizada) de renomear uma chave em um objeto javascript?
Uma maneira não otimizada seria:
o[ new_key ] = o[ old_key ];
delete o[ old_key ];
javascript
object
key
rename
Jean Vincent
fonte
fonte
Respostas:
A maneira mais completa (e correta) de fazer isso seria, acredito:
Este método garante que a propriedade renomeada se comporte de forma idêntica à original.
Além disso, parece-me que a possibilidade de agrupar isso em uma função / método e colocá-lo
Object.prototype
é irrelevante em relação à sua pergunta.fonte
if (old_key !== new_key)
para:if (old_key !== new_key && o[old_key])
Você pode agrupar o trabalho em uma função e atribuí-lo ao
Object
protótipo. Talvez use o estilo de interface fluente para fazer com que várias renomeações fluam.Específico do ECMAScript 5
Eu gostaria que a sintaxe não fosse tão complexa, mas é definitivamente bom ter mais controle.
fonte
Object.defineProperty
.hasOwnProperty
para verificar propriedades e dentro defor ... in
loops, por que importa se estendemos o Object?Se você estiver modificando seu objeto de origem, o ES6 poderá fazê-lo em uma linha.
Ou duas linhas, se você deseja criar um novo objeto.
fonte
[]
em torno denewKey
? A solução funciona sem isso, na verdade.Caso alguém precise renomear uma lista de propriedades:
Uso:
fonte
my_object_property
paramyObjectProperty
, no entanto, se minha propriedade tivesse uma palavra, a chave foi removida. 1Gostaria apenas de usar o
ES6(ES2015)
caminho!fonte
Se você não deseja alterar seus dados, considere esta função ...
Uma explicação completa de Yazeed Bzadough https://medium.com/front-end-hacking/immutably-rename-object-keys-in-javascript-5f6353c7b6dd
fonte
A maioria das respostas aqui falham em manter a ordem dos pares de valores-chave do JS Object. Se você possui uma forma de pares de valores-chave de objeto na tela que deseja modificar, por exemplo, é importante preservar a ordem das entradas do objeto.
A maneira do ES6 de percorrer o objeto JS e substituir o par de valores-chave pelo novo par por um nome de chave modificado seria algo como:
A solução preserva a ordem das entradas adicionando a nova entrada no lugar da antiga.
fonte
Você pode tentar lodash
_.mapKeys
.fonte
Uma variação usando o operador de desestruturação e propagação de objetos:
fonte
Pessoalmente, a maneira mais eficaz de renomear chaves no objeto sem implementar plugins e rodas extra pesados:
Você também pode envolvê-lo
try-catch
se seu objeto tiver uma estrutura inválida. Funciona perfeitamente :)fonte
'a'
em{ a: 1, aa: 2, aaa: 3}
ou tentar mudar o nome de um objeto com valores que são nada mais do que cordas ou números ou booleans, ou tentar com referências circulares.Para adicionar prefixo a cada chave:
fonte
Eu faria algo assim:
fonte
Eu diria que seria melhor, do ponto de vista conceitual, deixar o objeto antigo (o do serviço da web) como está e colocar os valores necessários em um novo objeto. Suponho que você esteja extraindo campos específicos em um ponto ou outro de qualquer maneira, se não no cliente, pelo menos no servidor. O fato de você optar por usar nomes de campos iguais aos do serviço da Web, apenas em minúsculas, não altera isso. Então, eu aconselho a fazer algo assim:
Claro, estou fazendo todos os tipos de suposições aqui, o que pode não ser verdade. Se isso não se aplicar a você, ou se for muito lento (não é? Não testei, mas imagino que a diferença diminua à medida que o número de campos aumenta), ignore tudo isso :)
Se você não quiser fazer isso e precisar suportar apenas navegadores específicos, também poderá usar os novos getters para também retornar "maiúsculas (campo)": consulte http://robertnyman.com/2009/05/28 / getters-and-setters-with-javascript-code-samples-and-demos / e os links nessa página para obter mais informações.
EDITAR:
Incrivelmente, isso também é quase duas vezes mais rápido, pelo menos no meu FF3.5 no trabalho. Veja: http://jsperf.com/spiny001
fonte
Embora isso não forneça exatamente uma solução melhor para renomear uma chave, ele fornece uma maneira rápida e fácil do ES6 de renomear todas as chaves em um objeto sem alterar os dados que eles contêm.
fonte
Algumas das soluções listadas nesta página têm alguns efeitos colaterais:
Aqui está uma solução que mantém a posição da chave no mesmo local e é compatível no IE9 +, mas precisa criar um novo objeto e pode não ser a solução mais rápida:
Observe: O IE9 pode não suportar forEach no modo estrito
fonte
Aqui está um exemplo para criar um novo objeto com chaves renomeadas.
fonte
Mais uma maneira com o mais poderoso método REDUCE .
fonte
Essa é uma pequena modificação que fiz na função de pomber; Para poder pegar uma matriz de objetos em vez de um objeto sozinho e você também pode ativar o índice. também as "Teclas" podem ser atribuídas por uma matriz
teste
fonte
Seu caminho é otimizado, na minha opinião. Mas você terminará com chaves reordenadas. A chave recém-criada será anexada no final. Eu sei que você nunca deve confiar na ordem das chaves, mas se precisar preservá-las, precisará passar por todas as chaves e construir um novo objeto, um por um, substituindo a chave em questão durante esse processo.
Como isso:
fonte
fonte
tente no seu editor favorito <3
fonte