¿Es posible cambiar el nombre de una propiedad en un Json o arreglo de Json?

publicado por: Anonymous

Necesito cambiar el nombre a una propiedad Json proveniente de un arreglo

[
{
 nombre : 'Luis',
 apellido : 'Gonzales'
},
{
 nombre : 'Maria',
 apellido : 'Perez'
},
{
 nombre : 'Ignacia',
 apellido : 'Valdebenito'
}
]

y necesito modificarla de la siguiente manera

[
{
 nombreUsuario : 'Luis',
 apellidoUsuario : 'Gonzales'
},
{
 nombreUsuario : 'Maria',
 apellidoUsuario : 'Perez'
},
{
 nombreUsuario : 'Ignacia',
 apellidoUsuario : 'Valdebenito'
}
]

¿Es posible hacerlo mediante una función y no hacerlo mediante un bucle for que recorra el arreglo para ingresarlo en otro?

solución

Hay 2 partes en esta pregunta, una es como renombrar la propiedad y lo otra es como hacerlo para un arreglo.

Algunos métodos diferentes que puedes usar…

Las versiones actuales de Node.js (y los navegadores modernos) implementan Array.prototype.map que te permite procesar un arreglo y obtener un resultado transformado. Este enfoque crea un nuevo objeto con las nuevas propiedades, es para una estructura -simple- como la utilizaste. De pocos campos.

_x000D_

_x000D_

var arreglo = [{_x000D_
  nombre: 'Luis',_x000D_
  apellido: 'Gonzales'_x000D_
}, {_x000D_
  nombre: 'Maria',_x000D_
  apellido: 'Perez'_x000D_
}, {_x000D_
  nombre: 'Ignacia',_x000D_
  apellido: 'Valdebenito'_x000D_
}];_x000D_
_x000D_
// para cada elemento, se crea un nuevo objeto con las nuevas propiedades._x000D_
var arreglado = arreglo.map( item => { _x000D_
  return { nombreUsuario: item.nombre , apellidoUsuario : item.apellido }; _x000D_
});_x000D_
_x000D_
console.log(arreglado);

_x000D_

_x000D_

_x000D_

Cuidado! Esta sintaxis no funcionara en versiones viejas de node 3.x, ni en navegadores viejos. Si necesitas hacerlo para node 3.x o navegadores viejos es muy parecido, debes cambiar la función flecha por una declaración normal y utilizar lodash.js o similar para tener la función map.

Uso del operador delete

Si quieres renombrar una sola propiedad (o unas pocas), puedes hacer algo así, aprovechando el operador delete.

_x000D_

_x000D_

var arreglo = [{_x000D_
  nombre: 'Luis',_x000D_
  apellido: 'Gonzales'_x000D_
}, {_x000D_
  nombre: 'Maria',_x000D_
  apellido: 'Perez'_x000D_
}, {_x000D_
  nombre: 'Ignacia',_x000D_
  apellido: 'Valdebenito'_x000D_
}];_x000D_
_x000D_
// para cada elemento... _x000D_
var arreglado = arreglo.map( item => { _x000D_
  // lo guardas temporalmente_x000D_
  var temporal = item.nombre;_x000D_
  // eliminas el valor que ya no quieres_x000D_
  delete item.nombre;_x000D_
  // creas el valor nuevo._x000D_
  item.nombreNuevo = temporal;_x000D_
  return item; _x000D_
});_x000D_
_x000D_
console.log(arreglado);

_x000D_

_x000D_

_x000D_

Claro que puedes hacerlo con un for, ya sea creando un obj o usando delete, pero map es mas idiomatico.

Por ultimo para la vieja escuela, en esta respuesta del sitio en inglés, se propone un método para renombrar las propiedades.

Object.prototype.renameProperty = function (oldName, newName) {
  // no hacer nada si los nombre son iguales
  if (oldName == newName) {
    return this;
  }
  // Verificar si ya existe la propiedad con el nombre nuevo y evitar errores.
  if (this.hasOwnProperty(oldName)) {
    this[newName] = this[oldName];
    delete this[oldName];
  }
  return this;
};

// lo usas así... también podrías usar map, o un for común..
// eso dependerá de la compatibilidad que necesites y lo
// "modernizado" que quieras que sea tu código.
for (var item of arreglo) {
  item.renameProperty('nombre', 'nombreUsuario');
  item.renameProperty('nombre', 'apellidoUsuario');
}
Respondido por: Anonymous

Leave a Reply

Your email address will not be published. Required fields are marked *