por ejemplo, tengo un archivo JSON como este
{ "employees": [ { "name": "Ram", "email": "ram@gmail.com", "age": 23 }, { "name": "Shyam", "email": "shyam23@gmail.com", "age": 28 }, { "name": "John", "email": "john@gmail.com", "age": 33 }, { "name": "Bob", "email": "bob32@gmail.com", "age": 33 } ] }
Ahora quiero crear una nueva matriz igual a esta, pero con un valor específico modificado, como si la edad fuera 33 y luego cambiar a 1, como
{ "employees": [ { "name": "Ram", "email": "ram@gmail.com", "age": 23 }, { "name": "Shyam", "email": "shyam23@gmail.com", "age": 28 }, { "name": "John", "email": "john@gmail.com", "age": 1 }, { "name": "Bob", "email": "bob32@gmail.com", "age": 1 } ] }
¿Cómo puedo hacer esto con lodash o javascript array? muchas gracias chico
Para crear una nueva matriz, debe tener cuidado de no modificar los elementos existentes de la matriz. Puede hacer esto de varias maneras, sin embargo, debido a que sus datos tienen varios niveles, el uso de funciones como Array.map()
o el operador Spread ( ...
) puede ser problemático. Primero debe copiar los datos. Una forma es usar JSON.stringify()
y JSON.parse()
para crear la copia, luego modificarla usando un método de manipulación de matrices ( .map()
, .reduce()
, .forEach()
, etc.) para modificar los datos .
var data = { employees: [ { name: "Ram", email: "ram@gmail.com", age: 23 }, { name: "Shyam", email: "shyam23@gmail.com", age: 28 }, { name: "John", email: "john@gmail.com", age: 33 }, { name: "Bob", email: "bob32@gmail.com", age: 33 } ] } var copy = JSON.parse(JSON.stringify(data)) copy.employees.map( elem => { elem.age = elem.age==33?1:elem.age; return elem } ) console.log(copy)
El mapa es la buena manera de hacerlo, pero si está anidado en algún lugar de un objeto, también puede agregar el operador de propagación:
const object = { employees: [ { name: "Ram", email: "ram@gmail.com", age: 23 }, { name: "Shyam", email: "shyam23@gmail.com", age: 28 }, { name: "John", email: "john@gmail.com", age: 33 }, { name: "Bob", email: "bob32@gmail.com", age: 33 }, ] } const employees = object.employees.map((employee) => { employee.age = employee.age === 33 ? 1 : employee.age; return employee }) const newObject = { ...object, employees: employees } console.log(newObject)
como @Tibrogargan mencionó, esta respuesta no es buena si necesita hacer una copia profunda porque la función de mapa hace una copia superficial, puede ver más sobre eso y más formas de hacer una copia profunda aquí https://javascript.plainenglish.io/how- para-copiar-profundamente-objetos-y-matrices-en-javascript-7c911359b089#:~:text=4.,objects%20are%20not%20really%20cloned .
puede que no sea bueno para ti. Por favor, comprueba la respuesta de Tibrogargan.
puedes usar el método de mapa de Javascript
let data = { employees: [ { name: "Ram", email: "ram@gmail.com", age: 23 }, { name: "Shyam", email: "shyam23@gmail.com", age: 28 }, { name: "John", email: "john@gmail.com", age: 33 }, { name: "Bob", email: "bob32@gmail.com", age: 33 }, ], }; let newArray = data.employees.map((emp) => { if (emp.age == 33) emp.age = 1; return emp; }); console.log(newArray);
más sobre la función de mapa https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/map