通过对象的迭代不返回真

问题描述 投票:0回答:2

谁能告诉我,我在这里做错了什么?

这个函数只返回第一个用户的信息。从来不返回第二个用户的信息。如果两个参数都为真,它应该返回第二个参数的任何值。

 var users = [{
        "name": "Klara",
        "surname": "Johnson",
        "color": "Yellow",
        "preference": ["Hot", "Double", "Sugar free"]
      },
      {
        "name": "Daenerys",
        "surname": "Targaryen",
        "color": "Salmon",
        "preference": ["Iced", "Single", "Chocolate"]
      }
    ];

    function findInfo(name, info) {
      for (i = 0; i < users.length; i++) {
        if (name === users[i].name) {
          if (users[i].hasOwnProperty(info)) {
            return users[i][info]
          } else {
            return "No such info"
          }
        } else {
          return "no such name"
        }
      }
    }

    console.log(findInfo('Klara', 'adsf'))

console.log(findInfo('Daenerys', 'color')) //Expected "Salmon", but log "No such name"
console.log(findInfo('Klara', 'color')) // Yellow
javascript
2个回答
1
投票

因为只要在函数内部遇到返回语句,函数就会返回指定的值并退出函数。在你的例子中,它是在检查 users[i]的名字是否与参数中的名字相同。如果是,它正在检查是否有一个名为 "info "的属性。由于没有info属性,它只是返回 "no property found "并退出函数,而不检查其他用户。你必须先遍历整个数组,如果仍然没有找到用户,才返回 "没有找到用户"。你的代码只检查第一个用户的名字是否等于参数。如果它不等于,你就会在遍历数组的其他元素之前返回 "no such name"。

工作代码。

var users = [{
    "name": "Klara",
    "surname": "Johnson",
    "color": "Yellow",
    "preference": ["Hot", "Double", "Sugar free"]
  },
  {
    "name": "Daenerys",
    "surname": "Targaryen",
    "color": "Salmon",
    "preference": ["Iced", "Single", "Chocolate"]
  }
];

function findInfo(name, info) {

  for (var i = 0; i < users.length; i++) {
    if (name === users[i].name) {

      if (users[i].hasOwnProperty(info)) {
        return users[i][info]
      } else {
        return "No such info"
      }
    }
  }
   //if you reach here that means that you have not found user in entire array
  return "no such name"; 
}
console.log(findInfo('Daenerys', 'asdf'))

1
投票

那是因为你在for循环中返回的时候 可能是在检查所有元素之前,如果没有找到用户,你应该在循环结束时返回,总之一个更简单的方法是:

function findInfo(name, info) {
  const user = users.find(e => e.name === name);
  if(!user) return "No such name";
  return user.hasOwnProperty(info) && user[info] || "No such info";
}

0
投票

一旦你从函数中返回,它就不会在下一次迭代中执行。不过你可以这样做

 var users = [{
        "name": "Klara",
        "surname": "Johnson",
        "color": "Yellow",
        "preference": ["Hot", "Double", "Sugar free"]
      },
      {
        "name": "Daenerys",
        "surname": "Targaryen",
        "color": "Salmon",
        "preference": ["Iced", "Single", "Chocolate"]
      }
    ];

   
    function findInfo(name, info) {
     var userFound = "no user found";
     var userInfo = "no info";
      for (i = 0; i < users.length; i++) {
        if (name === users[i].name) {
           userFound = users[i].name;
          if (users[i].hasOwnProperty(info)) {
            userInfo = users[i][info]; 
            break;
          }
        break;
        }
      }
      return {userFound, userInfo}
    }

    console.log(findInfo('Klara', 'adsf'));

console.log(findInfo('Daenerys', 'color')) ;
console.log(findInfo('Klara', 'color'));
© www.soinside.com 2019 - 2024. All rights reserved.