Javascript 为什么此函数不更新变量?

Javascript 为什么此函数不更新变量?,javascript,node.js,arrow-functions,Javascript,Node.js,Arrow Functions,你好,我有以下功能 update: (id) => { let updated = false database.users = database.users.map((user) => { if(user.id === id){ updated = true user.active = true; } return user })

你好,我有以下功能

update: (id) => {
      let updated = false
      
      database.users = database.users.map((user) => {
        if(user.id === id){
          updated = true
          user.active = true;
        }
        return user
      })

      return updated
    }
正如您所见,该函数迭代数组以更新属性user.active,并更新在外部声明的更新变量

我对此进行了调试,函数在if中输入,并更新值,但始终返回updated=false

如何更新该变量

我使用的是节点v14.16.1和巴贝尔:

{
    "presets": [
        "@babel/preset-env"
    ]
}
已更新

  • 该数据库是一个JSON对象,但不是异步的
  • 数据库可以有多个具有相同id的用户
关于为什么不更新的问题在arrow函数中更新


谢谢。

首先,您在地图功能中没有返回任何内容。
let database = {
  users: [
    { id: 1, name: "John" , age: 15, active: false },
    { id: 2, name: "Bob"  , age: 18, active: false },
    { id: 3, name: "James", age: 25, active: true },
    { id: 4, name: "Tom"  , age: 21, active: false },
  ]
}

function updateDatabase(id) {
  let isUpdated = false
  let copied = {...database};
  let idx = copied.users.findIndex((x) => x.id == id)
  if (idx !== -1) {
    copied.users[idx] = { ...copied.users[idx], active: true }
    isUpdated = true
  }
  database = copied
  return isUpdated;
} 

console.log(updateDatabase(2))
console.log(database)
当您只想更新一个元素时,也没有点可以映射到整个数组

const数据库={
用户:[
{id:1,姓名:“约翰”,年龄:15岁,在职:假},
{id:2,姓名:“Bob”,年龄:18岁,活动:false},
{身份证号码:3,姓名:“詹姆斯”,年龄:25岁,现役:真},
{id:4,姓名:“汤姆”,年龄:21岁,现役:假},
{id:4,姓名:“Karen”,年龄:19岁,在职:假},
]
}
const updateOne=id=>{
const user=database.users.find(e=>e.id==id)
如果(用户)user.active=true
返回!!用户
}
const updateAll=id=>{
const users=database.users.filter(e=>e.id==id)
users.forEach(e=>e.active=true)
return!!users.length
}
console.log(updateOne(2))
console.log(数据库)
console.log(updateAll(4))

console.log(数据库)
等等,这里的异步函数是什么?您正在使用
.map()
,但回调函数不返回任何内容。因此,
数据库。用户
最终将成为一个未定义的
值数组。相反,您应该使用
.some()
,回调应该更新用户,然后返回
true
,这应该是外部函数的返回值。数据库通常是异步的。如果不是,那是一个正常的sync
Array.prototype.map
,那么“我调试了它,函数在If中输入,并更新值,但总是返回updated=false。”就没有任何意义了。在后一种情况下,“缺少调试详细信息”是合适的,但我认为在这里采用更可能的方案是更好的选择。@AsdGerte有一点:函数database.users.map()必须是异步的,因此它会在(id)=>{…}中返回假值后更改“更新”状态call@IiroUllin那个或者数组中的“用户”对象都与id不匹配。如果OP包含一些关于
数据库
数据库的线索,当然会非常有用。用户
是什么。为什么要重新分配
数据库
?这不是原始代码所做的。“你只想更新一个元素”——谁知道呢?数组中可能有多个对象具有匹配的
id
:-)但这是一个合理的假设。顺便说一句,我会使用
find
而不是通过索引访问数组。@Bergi你说得对,通过引用更新更优雅。我已经更新了答案。可能会找到多个用户,问题是关于为什么更新的变量没有更新的原因。@Tialoc ES是您的数据库
id
a
string
number
?尝试将条件更改为:
user.id==id
+user.id===id