为了账号安全,请及时绑定邮箱和手机立即绑定

JavaScript等同于PHP的in_array()

JavaScript等同于PHP的in_array()

PHP
小唯快跑啊 2019-10-08 10:57:37
JavaScript中是否有一种方法可以比较一个数组中的值并查看它是否在另一个数组中?类似于PHP的in_array功能?
查看完整描述

3 回答

?
大话西游666

TA贡献1817条经验 获得超14个赞

不,它没有一个。因此,大多数流行的库在其实用程序包中都附带一个库。查看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原型,因为这样做通常是一个坏主意。


查看完整回答
反对 回复 2019-10-08
?
有只小跳蛙

TA贡献1824条经验 获得超8个赞

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;

  };

}

甚至还有一些方便的用法摘要,可助您编写脚本。


查看完整回答
反对 回复 2019-10-08
?
扬帆大鱼

TA贡献1799条经验 获得超9个赞

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


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;

}


查看完整回答
反对 回复 2019-10-08
  • 3 回答
  • 0 关注
  • 409 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信