【问题标题】:JavaScript equivalent of PHP's in_array()JavaScript 等效于 PHP 的 in_array()
【发布时间】:2010-10-21 12:07:49
【问题描述】:

在 JavaScript 中有没有一种方法可以比较一个数组中的值并查看它是否在另一个数组中?

类似于 PHP 的 in_array 函数?

【问题讨论】:

标签: php javascript phpjs


【解决方案1】:

不,它没有。出于这个原因,大多数流行的库都在其实用程序包中附带了一个。查看 jQuery 的 inArray 和 Prototype 的 Array.indexOf 示例。

jQuery 的实现和你想象的一样简单:

function inArray(needle, haystack) {
    var length = haystack.length;
    for(var i = 0; i < length; i++) {
        if(haystack[i] == needle) return true;
    }
    return false;
}

如果您正在处理数量合理的数组元素,上述方法会很好地解决问题。

编辑:哎呀。我什至没有注意到您想查看一个数组是否在另一个数组中。根据 PHP 文档,这是 PHP 的 in_array 的预期行为:

$a = array(array('p', 'h'), array('p', 'r'), 'o');

if (in_array(array('p', 'h'), $a)) {
    echo "'ph' was found\n";
}

if (in_array(array('f', 'i'), $a)) {
    echo "'fi' was found\n";
}

if (in_array('o', $a)) {
    echo "'o' was found\n";
}

// Output:
//  'ph' was found
//  'o' was found

Chris 和 Alex 发布的代码不遵循这种行为。 Alex的是Prototype的indexOf的正式版,而Chris的更像是PHP的array_intersect。这就是你想要的:

function arrayCompare(a1, a2) {
    if (a1.length != a2.length) return false;
    var length = a2.length;
    for (var i = 0; i < length; i++) {
        if (a1[i] !== a2[i]) return false;
    }
    return true;
}

function inArray(needle, haystack) {
    var length = haystack.length;
    for(var i = 0; i < length; i++) {
        if(typeof haystack[i] == 'object') {
            if(arrayCompare(haystack[i], needle)) return true;
        } else {
            if(haystack[i] == needle) return true;
        }
    }
    return false;
}

这是我对上面的测试:

var a = [['p','h'],['p','r'],'o'];
if(inArray(['p','h'], a)) {
    alert('ph was found');
}
if(inArray(['f','i'], a)) {
    alert('fi was found');
}
if(inArray('o', a)) {
    alert('o was found');
}  
// Results:
//   alerts 'ph' was found
//   alerts 'o' was found

请注意,我故意没有扩展 Array 原型,因为这样做通常是个坏主意。

【讨论】:

  • jQuery.inArray() not 返回布尔值。它返回找到的元素的索引,如果没有找到则返回 -1
  • 由于评分很高 - 您应该将您的答案标记为过时
  • 是的,这个答案已经过时了,正确答案在下面
【解决方案2】:

现在有Array.prototype.includes:

includes() 方法判断一个数组是否包含某个 元素,根据需要返回 true 或 false。

var a = [1, 2, 3];
a.includes(2); // true 
a.includes(4); // false

语法

arr.includes(searchElement)
arr.includes(searchElement, fromIndex)

【讨论】:

【解决方案3】:

Array.indexOf 是在 JavaScript 1.6 中引入的,但在旧版浏览器中不受支持。值得庆幸的是,Mozilla 的小伙子们已经为您完成了all the hard work,并为您提供了此功能以实现兼容性:

if (!Array.prototype.indexOf)
{
  Array.prototype.indexOf = function(elt /*, from*/)
  {
    var len = this.length >>> 0;

    var from = Number(arguments[1]) || 0;
    from = (from < 0)
         ? Math.ceil(from)
         : Math.floor(from);
    if (from < 0)
      from += len;

    for (; from < len; from++)
    {
      if (from in this &&
          this[from] === elt)
        return from;
    }
    return -1;
  };
}

甚至还有一些方便的使用 sn-ps 来满足您的脚本编写乐趣。

【讨论】:

  • 这是已经发布的链接/代码的更好/更安全/更好的实现;规范不要求检查大海捞针中的数组,这就是 OP 想要的。
  • 顺便问一下,this.length &gt;&gt;&gt; 0 的用途是什么?这是转换为 Number 类型吗?
  • Array.indexOf 现在已被 ECMAScript 第五版标准化,因此应该被视为正确的“原生”方式。不过,您仍然需要在很长一段时间内为旧版浏览器嗅探并提供此备份。 @harto:是的,它将 this.length 转换为可以表示为 32 位无符号整数的数字。一个原生的Array 只能有一个已经符合这个的长度,但是规范声明你可以在不是Array 的原生JS 对象上调用Array.prototype 方法。这个和其他迂腐的论据检查是为了保证绝对的规范合规性。
  • Mozilla 直接提供了不同的 polyfill 版本 - developer.mozilla.org/en/docs/Web/JavaScript/Reference/…
  • @harto 我在您发表评论 8 年后回答,但也许其他人可能有同样的问题 => 见 stackoverflow.com/questions/1822350/…
【解决方案4】:

PHP方式:

if (in_array('a', ['a', 'b', 'c'])) {
   // do something if true
}

我在 JS 中的解决方案:

if (['a', 'b', 'c'].includes('a')) {
   // do something if true
}

【讨论】:

    【解决方案5】:

    如果索引不按顺序,或者索引不连续,此处列出的其他解决方案中的代码将中断。一个更好的解决方案可能是:

    function in_array(needle, haystack) {
        for(var i in haystack) {
            if(haystack[i] == needle) return true;
        }
        return false;
    }
    

    而且,作为奖励,这里相当于 PHP 的 array_search(用于查找数组中元素的键:

    function array_search(needle, haystack) {
        for(var i in haystack) {
            if(haystack[i] == needle) return i;
        }
        return false;
    }
    

    【讨论】:

    • 不错的替代品。真正使从 php 移植到节点变得容易。谢谢
    【解决方案6】:

    您可以按照this lesson on w3schools 中的说明简单地使用“包含”功能

    看起来像

    let myArray = ['Kevin', 'Bob', 'Stuart'];
    if( myArray.includes('Kevin'))
    console.log('Kevin is here');

    【讨论】:

      【解决方案7】:

      有一个名为Locutus的项目,它用Javascript实现PHP函数,并包含in_array(),你可以像在PHP中一样使用它。

      使用示例:

      in_array('van', myArray);
      
      in_array(1, otherArray, true); // Forcing strict type
      

      【讨论】:

      • 在 JQuery 的 API 中还有一个 inArray 函数。检查api.jquery.com/jQuery.inArray
      • @ahPo,不错!但是 Locutus 实现的优点是纯 javascript 没有依赖项。因此,请选择最适合您需求的产品
      • 或者您可以从 Locutus 导入所需的function
      【解决方案8】:

      jQuery 解决方案可用,请在此处查看文档: http://api.jquery.com/jquery.inarray/

      $.inArray( 10, [ 8, 9, 10, 11 ] );
      

      【讨论】:

      • 不要忘记这样检查: if($.inArray( 10, [ 8, 9, 10, 11 ] ) > -1) 因为我确实喜欢这样: if($.inArray ( 10, [ 8, 9, 10, 11 ] )) 并且它总是返回 true
      • PS:这是类型敏感的,所以如果检查数字,请确保您的数据类型匹配!即: $.inArray('10', [ 8, 9, 10, 11 ] );将返回 -1
      【解决方案9】:
      var a = [1,2,3,4,5,6,7,8,9];
      
      var isSixInArray = a.filter(function(item){return item==6}).length ? true : false;
      
      var isSixInArray = a.indexOf(6)>=0;
      

      【讨论】:

        【解决方案10】:

        【讨论】:

        • 小心该功能目前没有完整的浏览器支持
        【解决方案11】:

        如果您只想检查单个值是否在数组中,那么 Paolo 的代码就可以完成这项工作。如果你想检查两个数组共有的值,那么你会想要这样的东西(使用 Paolo 的 inArray 函数):

        function arrayIntersect(a, b) {
            var intersection = [];
        
            for(var i = 0; i < a.length; i++) {
                if(inArray(b, a[i]))
                    intersection.push(a[i]);
            }
        
            return intersection;
        }
        

        这将返回ab 中的值数组。 (数学上,这是两个数组的intersection。)

        编辑:请参阅Paolo's Edited Code 了解您的问题的解决方案。 :)

        【讨论】:

        • 虽然这很好,但这并不是 OP 真正要求的;它没有复制 PHP 的 in_array 的功能。
        【解决方案12】:

        如果您需要所有PHP 可用参数,请使用:

        function in_array(needle, haystack, argStrict) {
            var key = '', strict = !!argStrict;
            if (strict) {
                for (key in haystack) {
                    if (haystack[key] === needle) {
                        return true;
                    }
                }
            }
            else {
                for (key in haystack) {
                    if (haystack[key] == needle) {
                        return true;
                    }
                }
            }
            return false;
        }
        

        【讨论】:

          【解决方案13】:

          将此代码添加到您的项目并使用对象样式的 inArray 方法

          if (!Array.prototype.inArray) {
              Array.prototype.inArray = function(element) {
                  return this.indexOf(element) > -1;
              };
          } 
          //How it work
          var array = ["one", "two", "three"];
          //Return true
          array.inArray("one");
          

          【讨论】:

            【解决方案14】:

            对于Dojo Toolkit,您将使用dojo.indexOf()。有关文档,请参阅 dojo.indexOf,有关示例,请参阅 Bryan Forbes 的 Arrays Made Easy

            【讨论】:

              【解决方案15】:
              function in_array(needle, haystack){
              
                  return haystack.indexOf(needle) !== -1;
              }
              

              【讨论】:

              • 这里只返回是否是数组的第一个元素;如果 indexOf(needle) &gt; 0 它将返回 false
              【解决方案16】:
              haystack.find(value => value == needle)
              

              其中 haystack 是一个数组,而 needle 是数组中的一个元素。如果未找到元素将返回 undefined 否则返回相同的元素。

              【讨论】:

                【解决方案17】:
                function in_array(what, where) {
                    var a=false;
                    for (var i=0; i<where.length; i++) {
                        if(what == where[i]) {
                            a=true;
                            break;
                        }
                    }
                    return a;
                }
                

                【讨论】:

                  【解决方案18】:

                  我在 SO 上找到了一个很棒的 jQuery 解决方案 here

                  var success = $.grep(array_a, function(v,i) {
                      return $.inArray(v, array_b) !== -1;
                  }).length === array_a.length;
                  

                  我希望有人会在下划线中发布如何执行此操作的示例。

                  【讨论】:

                    【解决方案19】:

                    in_arrayunderscore 的等价物是 _.indexOf

                    例子:

                    _.indexOf([3, 5, 8], 8); // returns 2, the index of 8 _.indexOf([3, 5, 8], 10); // returns -1, not found

                    【讨论】:

                      【解决方案20】:

                      如果您打算在课程中使用它,并且希望它具有功能性(并且可以在所有浏览器中使用):

                      inArray: function(needle, haystack)
                      {
                          var result = false;
                      
                          for (var i in haystack) {
                              if (haystack[i] === needle) {
                                  result = true;
                                  break;
                              }
                          }
                      
                          return result;
                      }
                      

                      希望它可以帮助某人:-)

                      【讨论】:

                        猜你喜欢
                        • 2010-12-29
                        • 2013-07-15
                        • 2015-01-16
                        • 1970-01-01
                        • 2010-11-07
                        • 1970-01-01
                        • 1970-01-01
                        • 2014-10-20
                        • 2015-01-04
                        相关资源
                        最近更新 更多