Javascript 如何使用简单的循环和';如果';声明?
我有三个数组和几个简单的循环。我想具体说明三个条件,这三个条件将显示一个来自华沙的人在一个Web开发人员的职位上,薪水超过2000英镑。问题是它显示的是两条记录,而不是一条 我尝试在每个循环中编写条件,但我的组合都不起作用Javascript 如何使用简单的循环和';如果';声明?,javascript,loops,if-statement,Javascript,Loops,If Statement,我有三个数组和几个简单的循环。我想具体说明三个条件,这三个条件将显示一个来自华沙的人在一个Web开发人员的职位上,薪水超过2000英镑。问题是它显示的是两条记录,而不是一条 我尝试在每个循环中编写条件,但我的组合都不起作用 var-people=[ {'name':'Viola','salary':2500,'姓':'Smith'}, {'name':'Boris','salary':1300,'姓':'Popkovitch'}, {'name':'John','salary':500,'姓'
var-people=[
{'name':'Viola','salary':2500,'姓':'Smith'},
{'name':'Boris','salary':1300,'姓':'Popkovitch'},
{'name':'John','salary':500,'姓':'Lynn'},
{'name':'Tom','salary':3300,'姓':'Gates'},
{'name':'Levis','salary':900,'姓':'Klark'},
];
工作场所变量=[
{'city':'New York','persons':['Viola']},
{'city':'Manchester','persons':['John','Boris']},
{'city':'Warsaw','persons':['Tom','Levis']},
];
变量作业=[
{'position':'Head manager','workers':['Boris']},
{'position':'WebDeveloper','workers':['Tom','Viola']},
{'position':'Principal','workers':['Levis','John']}
];
var数组=[];
for(var x=0;x2000){
array.push(人[x]);
}
}
}
};
console.log(数组)
您需要测试人员[x].name
是否在工作场所[y].persons
和作业[z].workers
中
var-people=[
{'name':'Viola','salary':2500,'姓':'Smith'},
{'name':'Boris','salary':1300,'姓':'Popkovitch'},
{'name':'John','salary':500,'姓氏:'Lynn'},
{'name':'Tom','salary':3300,'姓':'Gates'},
{'name':'Levis','salary':900,'姓':'Klark'},
];
工作场所变量=[
{'city':'newyork','persons':['Viola']},
{'city':'Manchester','persons':['John','Boris']},
{'city':'Warsaw','persons':['Tom','Levis']},
];
变量作业=[
{'position':'Head manager','workers':['Boris']},
{'position':'WebDeveloper','workers':['Tom','Viola']},
{'position':'Principal','workers':['Levis','John']}
];
var数组=[];
for(var x=0;x2000
&&作业[z].workers.includes(人员[x].name)
&&工作场所[y]。人员。包括(人员[x]。姓名)){
array.push(人[x]);
}
}
}
};
console.log(数组)代码>您的代码实际上是这样做的:如果列表中存在城市“华沙”,并且列表中存在职位“Web开发者”,那么请给我找到所有薪水超过2k的人。由于前两个条件在示例数据()中为true,因此您编写的代码将返回列表中薪水超过2k的所有人,这就是您观察到的结果
在这一点上,我建议您考虑您拥有的数据结构是否适合根据这些标准筛选人员。但假设您需要坚持当前的数据表示。此外,您编写和Barmar复制的代码效率极低。以下是一个(明智的)人类要完成这样一项任务所要做的:
在工作场所列表中找到“华沙”,并用记号笔突出显示;如果未找到,请转到8.
在工作列表中找到“Web开发者”,并用记号笔突出显示;如果未找到,请转到8.
找到薪资>2000的第一人;如果未找到,请转到8.
在突出显示的城市人员列表中查找人员姓名;如果未找到,请转到8.
在突出显示的作业的工作人员列表中查找人员姓名;如果未找到,请转到8.
耶,我找到了一个符合条件的记录,把它推到输出李>
找到下一个工资>2000的人;如果找到,请转到4.
完成了李>
你在上面的算法中看到了for循环吗?有人会说这些循环隐藏在那里。这是真的,但是现在我们有(我希望你不介意Python代码)做完全相同的事情——隐藏循环。这类函数的一个例子是。它接受一个回调(委托、lambda、谓词、arrow函数、callitwhatyouwant等)参数,该参数对数组中的每个元素按它们在数组中出现的顺序执行一次。回调决定是否在结果数组中保留特定元素。该函数的结果是一个新数组,其中填充了回调函数返回的元素true
。让我们开始构建这个函数
const array = people.filter(person => person.salary > 2000);
这里我传递了一个作为参数,因为它的语法简洁。这行代码有效地实现了上述算法的步骤#3
和#7
。以下是步骤#1
和#2
的代码:
我使用该功能查找所需的记录。当然,这假定城市名称和职位名称在数组中是唯一的。你还记得关于数据结构的那一点吗?但没关系,让我们把它放在一边<代码>工作场所&&
在第二行是为了防止在找不到“华沙”时进行无意义的查找。现在,让我们把这一切放在一起:
const warsaw = workplace.find(aWorkplace => aWorkplace.city === 'Warsaw');
const webDeveloper = workplace && job.find(aJob => aJob.position === 'Web developer');
const array = (warsaw && webDeveloper && people.filter(person =>
person.salary > 2000 &&
warsaw.persons.includes(person.name) &&
webDeveloper.workers.includes(person.name)
)) || [];
我知道我本可以省略第三行的华沙&
,但我更喜欢保留它,以免在逻辑中引入“谜题”
那么我们在这里学到了什么?我们为什么要经历这些?如果将基于循环的原始代码与上面的代码进行比较,您会很快发现后者可读性更强,因为它基本上是用纯英语编写的,效率更高,因为它避免了执行不必要的测试
const warsaw = workplace.find(aWorkplace => aWorkplace.city === 'Warsaw');
const webDeveloper = workplace && job.find(aJob => aJob.position === 'Web developer');
const array = (warsaw && webDeveloper && people.filter(person =>
person.salary > 2000 &&
warsaw.persons.includes(person.name) &&
webDeveloper.workers.includes(person.name)
)) || [];