【问题标题】:Getting undefined when iterating through a parsed JSON遍历解析的 JSON 时未定义
【发布时间】:2019-03-25 20:00:16
【问题描述】:

我有一个函数可以检查新用户的名字、姓氏和电子邮件是否与我的 node.js 模拟数据库(JSON 文件)中的相同。它失败了,因为在第一次迭代之后电子邮件是undefined。即,如果我添加一个具有重复电子邮件的用户,它将失败,因为比较 db_email === email 永远不会是真的(在第一次迭代之后)。

发生了什么?我是否遗漏了一些明显的东西?

db.json

[{"basic_info":{"first_name":"Diego","last_name":"Gonzalez","phone_number":"451-124-5112","postal_code":"G1F 1F5"},"address":{"email_address":"dgonz@gmail.com","street_no_and_name":"45 Kirklane Drive","city":"Rome","country":"Italy"},"banking_info":{"occupation":"accountant","annual_salary":45000,"monthly_expenses":2000},"products":{"chequing":true,"savings":true,"line_of_credit":false,"mortgage":true,"credit_card":true},"user_id":1},{"basic_info":{"first_name":"Marie","last_name":"Spitzer","phone_number":"640-998-3252","email_address":"mspitzer@gmail.com"},"address":{"street_no_and_name":"425 Godstone Lane","city":"Mexico City","country":"Mexico","postal_code":"Q1P 0F1"},"banking_info":{"occupation":"firefighter","annual_salary":95000,"monthly_expenses":5000},"products":{"chequing":false,"savings":false,"line_of_credit":false,"mortgage":false,"credit_card":true},"user_id":2},{"basic_info":{"first_name":"Jacob","last_name":"Karr","phone_number":"437-990-2275","email_address":"jacob.carr@carr.com"},"address":{"street_no_and_name":"23","city":"Rowena Drive","country":"Timbucktoo","postal_code":"M5H3P5"},"banking_info":{"occupation":"Consultant","annual_salary":"900001","monthly_expenses":"2440"},"products":{"Chequing":false,"Savings":false,"Line of Credit":false,"Mortage":false,"Credit Card":true},"user_id":3},{"basic_info":{"first_name":"Jacob","last_name":"Karr","phone_number":"437-990-2275","email_address":"jacob.carr@carr.com"},"address":{"street_no_and_name":"23","city":"Rowena Drive","country":"Timbucktoo","postal_code":"M5H3P5"},"banking_info":{"occupation":"Consultant","annual_salary":"900001","monthly_expenses":"2440"},"products":{"Chequing":false,"Savings":false,"Line of Credit":false,"Mortage":false,"Credit Card":true},"user_id":4}]

api.js

const validateRegistration = (fn, ln, email) => {
const reg = fs.readFileSync('db/registration.json', 'utf8');
const regObject = JSON.parse(reg);

const existingUsers = regObject.filter(userInfo => {
    const db_fn = userInfo["basic_info"]["first_name"];
    const db_ln = userInfo["basic_info"]["last_name"];
    const db_email = userInfo["address"]["email_address"];

    console.log(`${db_fn} === ${fn} = ${db_fn === fn}`);
    console.log(`${db_ln} === ${ln} = ${db_ln === ln}`);
    console.log(`${db_email} === ${email} = ${db_email === email}`);

    if (db_fn === fn && db_ln === ln && db_email === email) { return true; }
})

return existingUsers.length > 0 ? true : false;

}

console.log 输出

Diego === Jacob = false
Gonzalez === Karr = false
dgonz@gmail.com === jacob.carr@carr.com = false
Marie === Jacob = false
Spitzer === Karr = false
undefined === jacob.carr@carr.com = false
Jacob === Jacob = true
Karr === Karr = true
undefined === jacob.carr@carr.com = false

提前感谢您的帮助!

【问题讨论】:

  • 你的 JSON 有点不对劲,第一条记录有 email_address 嵌套在 address 中,其他 3 条记录都在 basic_info

标签: javascript


【解决方案1】:

想通了;也觉得挺傻的。

我将“email_address”放在 JSON 中的“address”下,它应该放在“basic_info”下。也应该通过 api.js 中的const db_email = userInfo["basic_info"]["email_address"]; 访问它

【讨论】:

    【解决方案2】:

    这是预期的 javascript 行为:未设置引用时返回 undefined。

    您的 JSON 数组不一定对每个对象都有一个“email_address”字段,因此“未定义”是值占位符,因为它没有找到。

    没有 email_address 的用户对象 [地址] 示例:

    "address":{"street_no_and_name":"23","city":"Rowena Drive","country":"Timbucktoo","postal_code":"M5H3P5"}

    【讨论】:

      【解决方案3】:
        {
          "basic_info": {
            "first_name": "Jacob",
            "last_name": "Karr",
            "phone_number": "437-990-2275",
            "email_address": "jacob.carr@carr.com"
          },
          "address": {
            "street_no_and_name": "23",
            "city": "Rowena Drive",
            "country": "Timbucktoo",
            "postal_code": "M5H3P5"
          },
          ...
          "user_id": 4
        }
      

      看起来email_address 实际上嵌套在basic_info 下,用于除第一个用户之外的所有用户。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2014-04-03
        • 1970-01-01
        • 2013-02-19
        • 2018-03-15
        • 2023-03-05
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多