在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)
)