JavaScript的等价于PHP的in_array()

JavaScript equivalent of PHP's in_array()

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

类似于php的in_array函数?


不,没有。出于这个原因,大多数流行的库在其实用程序包中都有一个库。查看jquery的inarray和prototype的array.indexof以获取示例。

jquery对它的实现如您所期望的那样简单:

1
2
3
4
5
6
7
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的预期行为:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
$a = array(array('p', 'h'), array('p', 'r'), 'o');

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

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

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

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

克里斯和亚历克斯发布的代码没有遵循这种行为。亚历克斯的是原型的indexof的官方版本,而克里斯的更像是PHP的array_intersect。这就是你想要的:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
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;
}

我在上面的测试是:

1
2
3
4
5
6
7
8
9
10
11
12
13
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

注意,我故意不扩展数组原型,因为这样做通常是一个坏主意。


在javascript 1.6中引入了Array.indexOf,但在旧的浏览器中不支持它。谢天谢地,Mozilla的团队为您做了所有的努力,并为您提供了兼容性:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
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;
  };
}

甚至还有一些方便的使用代码片段,让您享受编写脚本的乐趣。


现在有了Array.prototype.includes

The includes() method determines whether an array includes a certain
element, returning true or false as appropriate.

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

Syntax

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


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

1
2
3
4
5
6
function in_array(needle, haystack) {
    for(var i in haystack) {
        if(haystack[i] == needle) return true;
    }
    return false;
}

另外,这里还有相当于php的array_search(在数组中查找元素的键:

1
2
3
4
5
6
function array_search(needle, haystack) {
    for(var i in haystack) {
        if(haystack[i] == needle) return i;
    }
    return false;
}


有一个名为ocatus的项目,它在javascript中实现了PHP函数,并且包含在_Array()中,您可以像在PHP中那样使用它。

使用示例:

10


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

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


1
2
3
4
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;

有一个等价函数:

1
includes()

看这里:https://developer.mozilla.org/en-us/docs/web/javascript/reference/global_对象/array/includes


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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
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;
}

将此代码添加到项目中并使用对象样式Inray方法

1
2
3
4
5
6
7
8
9
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");


如果只想检查数组中是否有单个值,那么paolo的代码就可以完成这项工作。如果要检查两个数组的公共值,则需要类似这样的值(使用paolo的inarray函数):

1
2
3
4
5
6
7
8
9
10
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中的值数组。(在数学上,这是两个数组的交集。)

编辑:有关问题的解决方案,请参阅Paolo的编辑代码。:)


使用Dojo工具包,您可以使用dojo.indexOf()。有关文档,请参见dojo.indexof,以及布莱恩福布斯简化的数组,以获取一些示例。


1
2
3
4
5
6
7
8
9
10
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;
}

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

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

我希望有人能在下面的下划线中发布一个如何做到这一点的示例。


1
2
3
4
function in_array(needle, haystack){

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


underscore相当的in_array

实例:

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


如果要在类中使用它,并且希望它具有功能性(并且在所有浏览器中都可以使用),请执行以下操作:

1
2
3
4
5
6
7
8
9
10
11
12
13
inArray: function(needle, haystack)
{
    var result = false;

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

    return result;
}

希望它能帮助别人:-)