You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Vue2.5 methods中遍历data数组对象取值undefined的问题求解

代码错误说明
  • 数组属性访问错误:this.list是存储账号信息的数组类型数据,本身不存在user属性,直接执行console.log(this.list.user)必然返回undefined。模板中v-for可以正常渲染,是因为指令内部循环取出了数组中的单个账号对象,并非直接读取数组根节点的属性。
  • 遍历逻辑错误:for...in语法遍历数组时,循环变量拿到的是数组的字符串格式索引(例如"0"、"1"),不是数组内存储的账号对象,因此读取item.user时,实际是在读取字符串索引值的user属性,自然返回undefined。
  • 语法结构错误:原代码checkPass方法内的for循环、if判断都缺少闭合大括号,会直接触发JS语法解析错误。
  • 兼容隐患:原代码data中tryPass:''末尾多了冗余逗号,在低版本JS环境下可能触发语法解析错误。
修复方案

优先推荐用数组原生find方法做账号匹配,代码更简洁易读,修正后的checkPass方法逻辑如下:

checkPass(){
    // 匹配list中用户名和输入一致的账号
    const targetAccount = this.list.find(item => item.user === this.tryUser)
    if(!targetAccount){
        alert('用户名不存在')
        return
    }
    if(targetAccount.password === this.tryPass){
        alert('校验通过')
        // 此处编写登录成功后的业务逻辑即可
    }else{
        alert('密码错误')
    }
}

如果习惯用for循环实现,不要用for...in遍历数组,改用for...of直接获取数组元素:

checkPass(){
    for(const account of this.list){
        if(account.user === this.tryUser){
            if(account.password === this.tryPass){
                alert('校验通过')
            }else{
                alert('密码错误')
            }
            return
        }
    }
    alert('用户名不存在')
}

完整修正后的Vue实例代码:

const app = new Vue({
    el:"#app",
    data:{
        list:[
            {user:'cpalma',password:'123456'},
            {user:'cjara',password:'654321'}
        ],
        tryUser:'',
        tryPass:'' // 移除了末尾冗余逗号
    },
    methods:{
        checkPass(){
            const targetAccount = this.list.find(item => item.user === this.tryUser)
            if(!targetAccount){
                alert('用户名不存在')
                return
            }
            if(targetAccount.password === this.tryPass){
                alert('登录成功')
            }else{
                alert('密码输入错误,请重试')
            }
        }
    }
})

内容的提问来源于stack exchange,提问作者donlurdd

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.27 13:09:17