在Javascript中以IF条件遍历数组

时间:2015-04-30 16:13:46

标签: 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是搜索字符串; 'people'是一个人对象,只有一个名字和一个姓名和一个作业,但只有一个数组是people.skills - 无论如何,我可以在if-conditional中通过匿名遍历该数组功能

6 个答案:

答案 0 :(得分:6)

您可以使用Array.prototype.some来评估数组中至少一个条目的条件是否为真。这比Array.prototype.filter更好,因为它将在第一个条目的早期退出以评估为真。

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中的新内容,即fairly well supported now

通过将您的平等比较与Array.prototype.indexOf切换,以查看字符串是否包含搜索字词,您可以通过部分字词搜索而非精确搜索来改进搜索。< / p>

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;
}

答案 1 :(得分:3)

Array.prototype.some方法可达到此目的:

if (searchStr == people.first_name ||
    searchStr == people.last_name || 
    searchStr == people.job || 
    people.skills.some(function(skill) {
      return searchStr == skill;
    })) {
  Results.push(people)
}

但在这种情况下,不需要使用匿名函数。我们可以使用Array.prototype.indexOf方法:

if (searchStr == people.first_name ||
    searchStr == people.last_name || 
    searchStr == people.job || 
    people.skills.indexOf(searchStr) != -1) {
  Results.push(people)
}

或更具惯用性:

    people.skills.indexOf(searchStr)+1

请注意,Array.prototype.everysomeforEachfilterreducereduceRight方法是ECMAScript 5的一部分,因此,在仅支持ECMAScript&lt; = 3.1的旧浏览器中不支持。如果这是一个问题,您应该使用a polyfill

答案 2 :(得分:2)

您可以使用indexOf来确定数组中是否存在使用javascript的值,如果您真的需要遍历数组,那么请使用像@DanielImms推荐的某些函数。

if (searchStr == people.first_name ||
    searchStr == people.last_name || 
    searchStr == people.job || 
    people.skills.indexOf(searchStr)>-1) {
  Results.push(people)
}

答案 3 :(得分:1)

另一种选择是使用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)
}

答案 4 :(得分: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)
}

为了后人的缘故,我会留下这个,但这种方法可能只有在people.skills是多维的时候才有用。

作为旁注,我怀疑indexOf的效果要比执行filter mapsome高得多。

答案 5 :(得分:1)

为了彻底,如果你处于最前沿并使用Ecmascript 7,你可以使用Array.prototype.includes()

In [1359]: x.max()[x.max() == x.max(axis=1).max()].index
Out[1359]: Index([u'11'], dtype='object')