簡體   English   中英

JavaScript 相當於 PHP 的 in_array()

[英]JavaScript equivalent of PHP's in_array()

JavaScript 中有沒有一種方法可以比較一個數組中的值並查看它是否在另一個數組中?

類似於PHP的in_array function?

不,它沒有。 出於這個原因,大多數流行的庫都在其實用程序包中提供了一個。 查看 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 原型,因為這樣做通常是一個壞主意。

現在有Array.prototype.includes

contains() 方法確定數組是否包含某個元素,並根據需要返回 true 或 false。

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

句法

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

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

甚至還有一些方便的使用片段供您編寫腳本。

PHP方式:

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

我在 JS 中的解決方案:

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

如果索引不按順序,或者如果索引不連續,這里列出的其他解決方案中的代碼將中斷。 一個效果更好的解決方案可能是:

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

您可以簡單地使用w3schools 上本課中所述的“包含”功能

看起來像

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

有一個名為Locutus的項目,它在 Javascript 中實現了 PHP 函數,並且包含了in_array() ,您可以像在 PHP 中一樣使用它。

使用示例:

in_array('van', myArray);

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

jQuery 解決方案可用,請在此處查看文檔: http ://api.jquery.com/jquery.inarray/

$.inArray( 10, [ 8, 9, 10, 11 ] );
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;

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

將此代碼添加到您的項目並使用對象樣式的 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");

如果您只想檢查數組中是否有單個值,那么 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的值數組。 (在數學上,這是兩個數組的交集。)

編輯:請參閱Paolo 的編輯代碼以解決您的問題。 :)

function in_array(needle, haystack){

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

其中 haystack 是一個數組,needle 是數組中的一個元素。 如果未找到元素將返回 undefined 否則相同的元素。

對於Dojo Toolkit ,您將使用dojo.indexOf() 有關文檔,請參閱dojo.indexOf ,有關示例,請參閱 Bryan Forbes 的Arrays Made Easy

我在這里找到了一個很棒的 jQuery 解決方案。

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

我希望有人能在下划線中發布一個如何執行此操作的示例。

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

underscorein_array的等價物是_.indexOf

例子:

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

如果你打算在課堂上使用它,並且你更喜歡它的功能性(並在所有瀏覽器中工作):

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

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

    return result;
}

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

var value = 'a';
var array = ['a', 'b', 'c'];
if(array.indexOf(value)){
    // exists in array
} else {
   // Not exists in array
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM