javascript - 解决 Js 对象属性查找
问题描述
由于我不明白的原因,此代码中的以下函数正在工作。请有人向我解释为什么第二个 if 语句如果没有嵌套在第一个中就行不通。还有为什么第一条语句不需要返回。
var contacts = [{
"firstName": "Akira",
"lastName": "Laine",
"number": "0543236543",
"likes": ["Pizza", "Coding", "Brownie Points"]
},
{
"firstName": "Harry",
"lastName": "Potter",
"number": "0994372684",
"likes": ["Hogwarts", "Magic", "Hagrid"]
},
{
"firstName": "Sherlock",
"lastName": "Holmes",
"number": "0487345643",
"likes": ["Intriguing Cases", "Violin"]
},
{
"firstName": "Kristian",
"lastName": "Vos",
"number": "unknown",
"likes": ["JavaScript", "Gaming", "Foxes"]
}
];
function lookUpProfile(name, prop) {
for (let x = 0; x < contacts.length; x++) {
if (contacts[x].firstName === name) {
if (contacts[x].hasOwnProperty(prop)) {
return contacts[x][prop];
} else {
return "No such property";
}
}
}
return "No such contact";
}
lookUpProfile("Akira", "likes");
解决方案
我相信您的问题基本上是关于嵌套 if 语句和return
,而不是在每个if
语句中进行的具体检查,所以我的回答反映了这一假设。
从根本上说,if 语句会检查某些内容,当某些内容为真时,它将运行括号中的一些代码。
因此,当您有 2 个嵌套 if 语句时:
if (a) {
if (b) {
return x();
}
}
在上面的例子中,只有当两者都为真return x()
时才会运行。 a
b
如果我们要重新组织这个:
if (a) {
}
if (b) {
return x();
}
在这种情况下,return x()
will ifb
为真。a
没有效果。
在这个例子中:
if (a) {
return x();
}
if (b) {
return x();
}
以上,如果其中一个为真,x()
则将运行。所以如果是真的,但是是假的,我们仍然会返回。 a
b
b
a
您的代码的目的是在两个条件都为真时返回。这是另一种写法:
if (a && b) {
return x();
}
之所以没有这样做,是因为如果该属性不存在,该任务需要第二个条件返回一个特定的字符串“No such property”,如果该属性确实存在并且确实存在,则忽略该联系人并继续下一个联系人不匹配name
。
将其应用于我们的 if 语句,它基本上变成了这样:
if (a) {
if (b) {
return x();
} else {
return "No such property";
}
} else {
// Do nothing! this else statement doesn't
// exist in your code, but I'm adding it in
// To illustrate that we do nothing if a is
// false
}
不过,有一种更优雅的方式来编写它,我们可以反转“b”检查并提前返回:
if (!b) {
return 'No such property';
}
if (a) {
return x();
}
在没有嵌套的情况下这是正确的原因是:
- 如果
b
为假,我们确定我们要返回错误。 - 当我们使用
return
时,函数会立即结束/退出,因此可以保证a
检查永远不会发生。
推荐阅读
- docker - 如何访问 Docker Desktop 使用的 wsl 环境?(视窗)
- flutter - Get.changeTheme 在真实设备上不起作用
- python - 文档字符串未填充 Sphinx 文档
- python - Rabbitmq 消费者和 celery 消费者有什么区别?
- python - 如何在数据框中将浮点数转换为货币(美元)?
- ruby-on-rails-3 - 使用 Rails 更新到 Ruby 3.0.x:在平面命名空间“_RHASH_EMPTY_P”中找不到符号
- c# - 有没有办法改变两个相互依赖的不同对象的颜色
- c - 为什么我的 CodeBlocks 应用程序总是无法执行代码?
- react-native - 如何重置到默认位置 PanResponder React Native
- python - 如何使用 html 在烧瓶中显示从 python 脚本的输出中获得的 2 张图像?