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