PHP के in_array () के बराबर जावास्क्रिप्ट


223

क्या जावास्क्रिप्ट में एक तरह से मूल्यों की तुलना करना और यह देखना है कि क्या यह दूसरे सरणी में है?

PHP के in_arrayफ़ंक्शन के समान है ?

जवाबों:


258

नहीं, यह एक नहीं है। इस कारण से अधिकांश लोकप्रिय पुस्तकालय अपने उपयोगिता पैकेज में एक के साथ आते हैं। उदाहरणों के लिए jQuery के inArray और प्रोटोटाइप के 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

क्रिस और एलेक्स द्वारा पोस्ट किया गया कोड इस व्यवहार का पालन नहीं करता है। एलेक्स, प्रोटोटाइप के इंडेक्सऑफ का आधिकारिक संस्करण है, और क्रिस का 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

ध्यान दें कि मैंने जानबूझकर ऐरे प्रोटोटाइप का विस्तार नहीं किया है क्योंकि ऐसा करना आमतौर पर एक बुरा विचार है।


1
jQuery.inArray()बूलियन वापस नहीं करता है । यह पाए गए तत्व के सूचकांक को वापस कर देता है या -1 नहीं मिला तो
ब्रैड केंट

उच्च रेटिंग के कारण - आपको अपने उत्तर को पुराने के रूप में चिह्नित करना चाहिए
Gerfried


74

अब है Array.prototype.includes:

शामिल () विधि निर्धारित करती है कि क्या एक सरणी में एक निश्चित तत्व शामिल है, जो सही या सही के रूप में गलत है।

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

वाक्य - विन्यास

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

66

Array.indexOfजावास्क्रिप्ट 1.6 में पेश किया गया था, लेकिन यह पुराने ब्राउज़रों में समर्थित नहीं है। शुक्र है कि मोज़िला के ओवरों ने आपके लिए पूरी मेहनत की है , और आपको अनुकूलता प्रदान की है:

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

आपकी स्क्रिप्टिंग खुशी के लिए कुछ उपयोगी उपयोग स्निपेट्स भी हैं।


यह पहले से ही यहां पोस्ट किए गए लिंक / कोड का एक अच्छा / सुरक्षित / बेहतर कार्यान्वयन है; चश्मा हैस्टैक के अंदर सरणियों की जांच के लिए कॉल नहीं करता है, और यही ओपी चाहता है।
पाओलो बरगीनो

3
संयोग से, इसका उद्देश्य क्या है this.length >>> 0? क्या यह संख्या प्रकार में रूपांतरण है?
harto

3
Array.indexOfअब ECMAScript पांचवें संस्करण द्वारा मानकीकृत किया गया है, इसलिए इसे करने का उचित 'मूल' तरीका माना जाना चाहिए। यद्यपि आपको लंबे समय तक पुराने ब्राउज़र के लिए यह बैकअप सूँघना और प्रदान करना होगा। @harto: हाँ, यह this.lengthएक संख्या में परिवर्तित होता है जिसे 32-बिट अहस्ताक्षरित पूर्णांक के रूप में दर्शाया जा सकता है। एक मूल में Arrayकेवल एक लंबाई हो सकती है जो पहले से ही इसका अनुपालन करती है, लेकिन कल्पना बताती है कि आप Array.prototypeदेशी-जेएस वस्तुओं पर तरीकों को कॉल कर सकते हैं जो कि नहीं हैं Array। यह और अन्य पांडित्य संबंधी तर्क की जाँच सामान पूर्ण कल्पना-अनुपालन की गारंटी है।
बॉब

3
मोज़िला से सीधे एक अलग पॉलीफ़िल संस्करण उपलब्ध है - developer.mozilla.org/en/docs/Web/JavaScript/Reference/…
Algy Taylor

@harto मैं आपकी टिप्पणी के 8 साल बाद जवाब देता हूं, लेकिन हो सकता है कि किसी और का भी एक ही सवाल हो सकता है => देखें stackoverflow.com/questions/1822350/…
Frosty Z

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 से नोड के लिए आसान पोर्टिंग बनाई गई है। धन्यवाद
रहीम Khoja

9

एक परियोजना है जिसे लोक्टस कहा जाता है , यह जावास्क्रिप्ट में PHP के कार्यों को लागू करता है और in_array () शामिल है, आप इसका उपयोग ठीक उसी तरह से कर सकते हैं जैसे आप PHP में करते हैं।

उपयोग के उदाहरण:

in_array('van', myArray);

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

4
JQuery के एपीआई में एक inArray फ़ंक्शन भी है। चेक api.jquery.com/jQuery.inArray
ahPo

@ वाह, अच्छा लगा! लेकिन लोकुट्स के कार्यान्वयन में कोई निर्भरता के साथ शुद्ध जावास्क्रिप्ट होने का लाभ है। तो, अपनी आवश्यकताओं के लिए सबसे अच्छा एक का चयन करें
Marcio Mazzucato

1
या आप बस Locutus से आवश्यक फ़ंक्शन आयात कर सकते हैं ।
निकेत पाठक

7

आप बस w3schools पर इस पाठ में बताए गए "शामिल" फ़ंक्शन का उपयोग कर सकते हैं

ऐसा लग रहा है

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



5

jQuery समाधान उपलब्ध है, यहाँ ducumentation की जाँच करें: 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])) और यह हमेशा सही साबित होता है
temirbek

पुनश्च: यह संवेदनशील है इसलिए यदि संख्याओं की जाँच हो रही है तो सुनिश्चित करें कि आपका डेटाटाइप्स मेल खाता है! अर्थात: $ .Array ('10', [8, 9, 10, 11]); वापसी होगी -1
ओलिवर एम ग्रेच


3

यदि आप केवल यह देखना चाहते हैं कि किसी एकल मान किसी सरणी में है, तो पाओलो का कोड काम करेगा। यदि आप जांचना चाहते हैं कि दोनों सरणियों में कौन से मूल्य सामान्य हैं, तो आप कुछ इस तरह से चाहते हैं (पाओलो के ऐरा फ़ंक्शन का उपयोग करके):

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

यह मान है कि दोनों में हैं की एक सरणी लौट wil aऔर b। (गणितीय रूप से, यह दो सरणियों का एक चौराहा है।)

EDIT: अपनी समस्या के समाधान के लिए पाओलो का संपादित कोड देखें । :)


हालांकि यह अच्छा है, यह वास्तव में नहीं है कि ओपी ने क्या पूछा; यह PHP के in_array की कार्यक्षमता को दोहराता नहीं है।
पाओलो बरगिनिनो

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

मुझे SO पर यहाँ एक बेहतरीन 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यह झूठा वापस आ जाएगा
DiMono

0

के एक बराबर in_arrayके साथ underscoreहै _.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;
}

आशा है कि यह किसी की मदद करता है :-)

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.