Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/loops/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 如何使用简单的循环和';如果';声明?_Javascript_Loops_If Statement - Fatal编程技术网

Javascript 如何使用简单的循环和';如果';声明?

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,'姓'

我有三个数组和几个简单的循环。我想具体说明三个条件,这三个条件将显示一个来自华沙的人在一个Web开发人员的职位上,薪水超过2000英镑。问题是它显示的是两条记录,而不是一条

我尝试在每个循环中编写条件,但我的组合都不起作用

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)
    )) || [];