在Javascript中遍历IF条件中的数组
我正在创建一个非常轻量级的搜索功能,它包含以下内容:在Javascript中遍历IF条件中的数组,javascript,arrays,Javascript,Arrays,我正在创建一个非常轻量级的搜索功能,它包含以下内容: if (searchStr == people.first_name || searchStr == people.last_name || searchStr == people.job || searchStr == people.skills.forEach(function(x) { return x })) { Results.push(people) } searchStr是搜索字符串;'“peo
if (searchStr == people.first_name ||
searchStr == people.last_name ||
searchStr == people.job ||
searchStr == people.skills.forEach(function(x) { return x })) {
Results.push(people)
}
searchStr
是搜索字符串;'“people”是一个person对象,它有一个名字和姓氏以及一个职务,但是数组中只有一个是people.skills——我是否可以使用匿名函数遍历if条件中的数组?您可以使用array.prototype.some
来评估数组中至少一个条目上的条件是否为真。这比Array.prototype.filter
好,因为它将在第一个条目的早期退出以计算为true
if (searchStr == people.first_name ||
searchStr == people.last_name ||
searchStr == people.job ||
people.skills.some(function(x) { return searchStr == x })) {
Results.push(people)
}
Array.prototype.some
在Ecmascript 5中是新的,它是
通过使用
Array.prototype.indexOf
切换相等比较,查看字符串是否包含搜索项,您可以通过执行部分项搜索而不是精确搜索来改进搜索
if (contains(people.first_name, searchStr) ||
contains(people.last_name, searchStr) ||
contains(people.job, searchStr) ||
people.skills.some(function(x) { return contains(x, searchStr); })) {
Results.push(people)
}
function contains(a, b) {
return a.indexOf(b) >= 0;
}
您可以使用javascript来确定数组中是否存在值,如果确实需要遍历数组,则使用@DanielImms recomment之类的函数
if (searchStr == people.first_name ||
searchStr == people.last_name ||
searchStr == people.job ||
people.skills.indexOf(searchStr)>-1) {
Results.push(people)
}
另一个选项是使用
Array.reduce()
,它返回一个值
试试这个:
if (searchStr == people.first_name ||
searchStr == people.last_name ||
searchStr == people.job ||
people.skills.reduce(function(p,c) {
return p || (searchStr == c);
},false)
}
该方法用于此目的:
if (searchStr == people.first_name ||
searchStr == people.last_name ||
searchStr == people.job ||
people.skills.some(function(skill) {
return searchStr == skill;
})) {
Results.push(people)
}
但是在这种情况下,使用匿名函数是不必要的。我们可以使用以下方法:
或者,更习惯地说:
people.skills.indexOf(searchStr)+1
请注意,、和方法是ECMAScript 5的一部分,因此在仅支持ECMAScript的旧浏览器中不受支持
为了子孙后代的缘故,我将把这个问题留给大家,但这种方法可能只有在人的技能是多维的情况下才有用
作为旁注,我怀疑indexOf
比过滤器
映射
或一些执行更有效。为了彻底起见,如果您处于最前沿并使用Ecmascript 7,您可以使用
你只是想看看searchStr
是否存在于people.skills
中吗?为什么不直接使用indexOf
?注意forEach
忽略回调返回的值。然后,它返回未定义的。Well map将返回一个新数组,不是吗?这很有效!为了澄清,如果有匹配项,“return searchStr==x”将返回true,如果有匹配项,则该人员将被推入结果[],对吗?确实如此。但是,根据我的答案,考虑使用<代码>索引> <代码>,因为它不是冗长的。some
方法通常用于执行更复杂的查询。-1
可能应该是+1
。只有当searchStr
是people.skills
数组的第一个成员时,您的语句才会返回false
。@Witiko:我错了,我忘记了
符号:),您的意思是+1
应该是-1
对吗?
people.skills.indexOf(searchStr)+1
var searchSkills = [].concat.apply([], people.skills);
if (searchStr == people.first_name ||
searchStr == people.last_name ||
searchStr == people.job ||
searchSkills.indexOf(searchStr) >= 0 {
Results.push(people)
}
if (searchStr == people.first_name ||
searchStr == people.last_name ||
searchStr == people.job ||
people.skills.includes(searchStr)
)