如何通过 javascript lodash 更改嵌套 JSON 中的数据

How to change data in a nested JSON by javascript lodash

例如,我有一个 JSON 这样的文件

{
  "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 }
  ]
}

现在我想创建一个与此相同的新数组,但修改了特定值,例如如果年龄为 33 则更改为 1,例如

{
  "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 }
  ]
}

我如何使用 lodash 或 javascript 数组来做到这一点? 非常感谢你

正如@Tibrogargan 提到的,如果您需要进行深拷贝,这个答案并不好,因为 map 函数进行浅拷贝 更多相关信息和更多深度复制方法,您可以在此处查看 https://javascript.plainenglish.io/how-to-deep-copy-objects-and-arrays-in-javascript-7c911359b089#:~:text=4.,objects%20are%20not%20actually%20cloned

它可能对你不好请检查 Tibrogargan 答案

可以使用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);

关于地图功能的更多信息https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/map

为了创建新数组,您需要注意不要修改数组的现有元素。您可以通过多种方式执行此操作,但是由于您的数据是多层次的,因此使用 Array.map() 或 Spread 运算符 (...) 之类的函数可能会出现问题。您需要先复制数据。一种方法是使用 JSON.stringify()JSON.parse() 创建副本,然后使用数组操作方法(.map().reduce().forEach() 等)修改它以修改数据

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)

Map 是一个很好的方法,但如果它嵌套在对象中的某处,您还可以添加扩展运算符:

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)