JavaScript等同于PHP的in_array()


223

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

类似于PHP的in_array功能?

Answers:


258

不,它没有一个。因此,大多数流行的库在其实用程序包中都附带一个库。查看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

克里斯和亚历克斯发布的代码不遵循此行为。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原型,因为这样做通常是一个坏主意。


1
jQuery.inArray()没有返回boolean变量。它返回找到的元素的索引,如果未找到则返回-1
Brad Kent

由于评分很高-您应该将答案标记为过时
-Gerfried


74

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

66

Array.indexOf是在JavaScript 1.6中引入的,但较旧的浏览器不支持。幸运的是,Mozilla的麻烦为您完成了所有艰苦的工作,并为您提供了兼容性:

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

甚至还有一些方便使用的代码片段,使您的编写脚本倍感愉悦。


这是对此处发布的链接/代码的更好/更安全/更好的实现;规范不要求检查大海捞针内的数组,这就是OP想要的。
Paolo Bergantino,

3
顺便说一句,目的是this.length >>> 0什么?那是转换成数字类型吗?
harto

3
Array.indexOf现在已由ECMAScript第五版标准化,因此应被视为正确的“本机”处理方式。不过,您仍然需要长时间嗅探并为较旧的浏览器提供此备份。@harto:是的,它将转换this.length为可以表示为32位无符号整数的Number。本机Array只能具有已经符合此长度的长度,但是规范指出,您可以Array.prototype在not上的本机JS对象上调用方法Array。这以及其他学问性的参数检查工作是为了确保绝对符合规范。
bobince 2010年

3
-有直接从Mozilla的可用不同的填充工具版本developer.mozilla.org/en/docs/Web/JavaScript/Reference/...
阿尔杰·泰勒

@harto我回答您的评论后8年,但也许别人也有同样的疑问=“看stackoverflow.com/questions/1822350/...
雾ž

14

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

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到节点的移植变得容易。谢谢
Rahim Khoja

9

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

使用示例:

in_array('van', myArray);

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

4
JQuery的API中还有一个inArray函数。检查api.jquery.com/jQuery.inArray
ahPo

@ahPo,太好了!但是Locutus实现的优点是纯Javascript,没有依赖关系。因此,选择最适合您需要的最好的一个
马尔西奥Mazzucato

1
或者您可以只从Locutus 导入所需的功能
Niket Pathak's


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

5

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

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

3
不要忘了像这样检查:if($。inArray(10,[8,9,10,11])> -1),因为我这样做是这样的:if($。inArray(10,[8,9, 10,11]))),并且始终返回true
temirbek

PS:这是类型敏感的,因此如果检查数字,请确保您的数据类型匹配!即:$ .inArray('10',[8,9,10,11]); 会返回-1
Oliver M Grech


3

如果只想检查数组中是否有单个值,那么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;
}

这将返回a和中都包含一个值的数组b。(从数学上讲,这是两个数组的交集。)

编辑:请参阅Paolo的编辑代码,以解决您的问题。:)


尽管这很好,但OP并不是真正要求的。它没有复制PHP in_array的功能。
Paolo Bergantino,

3

如果需要所有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;
}

3

将此代码添加到您的项目中,并使用对象样式的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");



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

1

我在这里找到了一个很棒的jQuery解决方案。

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

我希望有人在下划线处举例说明如何执行此操作。


1
function in_array(needle, haystack){

    return haystack.indexOf(needle) !== -1;
}

这只会返回它是否是数组中的第一个元素。如果indexOf(needle) > 0它将返回false
DiMono 2014年

0

的等效in_arrayunderscore_.indexOf

例子:

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


0

如果您打算在一个类中使用它,并且希望它可以起作用(并且可以在所有浏览器中使用):

inArray: function(needle, haystack)
{
    var result = false;

    for (var i in haystack) {
        if (haystack[i] === needle) {
            result = true;
            break;
        }
    }

    return result;
}

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

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.