सवाल मैं कैसे जांचूं कि सरणी में जावास्क्रिप्ट में कोई ऑब्जेक्ट शामिल है या नहीं?


जावास्क्रिप्ट सरणी में कोई ऑब्जेक्ट है या नहीं, यह जानने के लिए सबसे संक्षिप्त और कुशल तरीका क्या है?

यह एकमात्र तरीका है जिसे मैं जानता हूं:

function contains(a, obj) {
    for (var i = 0; i < a.length; i++) {
        if (a[i] === obj) {
            return true;
        }
    }
    return false;
}

क्या इसे पूरा करने के लिए एक बेहतर और अधिक संक्षिप्त तरीका है?

यह स्टैक ओवरफ़्लो प्रश्न से बहुत करीबी से संबंधित है जावास्क्रिप्ट ऐरे में किसी आइटम को ढूंढने का सबसे अच्छा तरीका? जो एक सरणी में वस्तुओं को खोजने में पते को संबोधित करता है indexOf


3226
2017-10-25 22:14


मूल


अभी परीक्षण किया गया: आपका तरीका वास्तव में ब्राउज़र के लिए सबसे तेज़ है: jsperf.com/find-element-in-obj-vs-array/2 (एक चर में पूर्व-बचत a.length के अलावा) indexOf ($ .inArray में) का उपयोग करते समय बहुत धीमा है - Jörn Berkefeld
कई ने जवाब दिया है कि Array # indexOf यहां आपकी सबसे अच्छी पसंद है। लेकिन अगर आप कुछ ऐसा चाहते हैं जिसे बुलीयन में सही तरीके से डाला जा सके, तो इसका इस्तेमाल करें: ~[1,2,3].indexOf(4) 0 वापस आ जाएगा जो झूठी के रूप में मूल्यांकन करेगा, जबकि ~[1,2,3].indexOf(3) 3 वापस आ जाएगा जो सच के रूप में मूल्यांकन करेगा। - lordvlad
~ ऐसा नहीं है जिसे आप एक बुलियन में बदलने के लिए उपयोग करना चाहते हैं, जिसके लिए आपको आवश्यकता है !। लेकिन इस मामले में आप -1 के साथ समानता की जांच करना चाहते हैं, तो कार्य समाप्त हो सकता हैreturn [1,2,3].indexOf(3) === -1;  ~ एक द्विआधारी नहीं है, यह अलग-अलग मूल्य के प्रत्येक बिट को उलटा कर देगा। - mcfedr
@Iordvlad [1,2,3].indexOf(4) वास्तव में होगा वापसी -1। जैसा कि @ एमसीएफएडर ने बताया, ~ है bitwise- ऑपरेटर नहीं, ES5 11.4.8 देखें। चीज बाइनरी प्रतिनिधित्व के बाद से है -1 केवल 1 के होते हैं, यह पूरक है 0, जो झूठी के रूप में मूल्यांकन करता है। किसी अन्य नंबर का पूरक गैर-शून्य होगा, इसलिए सच है। इसलिए, ~ बस ठीक काम करता है और अक्सर संयोजन के साथ प्रयोग किया जाता है indexOf। - mknecht
शीर्षक भ्रामक है। कहाँ है [[1,2],[3,4]].includes([3,4]) ? - mplungjan


जवाब:


वर्तमान ब्राउज़रों है Array#includes, जो करता है ठीक ठीक उस, व्यापक रूप से समर्थित है, और एक है polyfill पुराने ब्राउज़र के लिए।

> ['joe', 'jane', 'mary'].includes('jane');
true 

आप भी उपयोग कर सकते हैं Array#indexOf, जो कम प्रत्यक्ष है, लेकिन पॉलीफिल को पुराने ब्राउज़र के लिए आवश्यक नहीं है।

jQuery ऑफर करता है $.inArray, जो कार्यात्मक रूप से बराबर है Array#indexOf

Underscore.js, एक जावास्क्रिप्ट उपयोगिता पुस्तकालय, प्रदान करता है _.contains(list, value), उर्फ _.include(list, value), जो दोनों उपयोग करते हैं के सूचकांक एक जावास्क्रिप्ट सरणी पारित अगर आंतरिक रूप से।

कुछ अन्य ढांचे समान तरीकों की पेशकश करते हैं:

ध्यान दें कि कुछ ढांचे इसे एक फ़ंक्शन के रूप में कार्यान्वित करते हैं, जबकि अन्य सरणी प्रोटोटाइप में फ़ंक्शन जोड़ते हैं।


3650
2017-10-25 23:10



MooTools में Array.contains भी है जो एक बुलियन लौटाता है, जो यहां वास्तविक प्रश्न की तरह लगता है। - Ryan Florence
प्रोटोटाइप भी है Array.includeजो एक बुलियन लौटाता है - user102008
यदि आप एक अच्छे ब्राउज़र का उपयोग कर रहे हैं, तो आप बस उपयोग कर सकते हैं array.indexOf(object) != -1 - Sam Soffes
इसके अलावा, एक शर्त के रूप में अकेले इंडेक्स का उपयोग न करें, क्योंकि पहला तत्व 0 लौटाएगा और इसका मूल्यांकन गलत साबित होगा - plus-
inArray एक समारोह के लिए एक भयानक नाम है जो तत्व की अनुक्रमणिका देता है, और -1 अगर यह अस्तित्व में नहीं है। मैं एक बूलियन वापस लौटने की उम्मीद करता हूँ। - Tim


अपडेट करें: जैसा कि @orip टिप्पणियों में उल्लेख करता है, लिंक किए गए बेंचमार्क 2008 में किया गया था, इसलिए परिणाम आधुनिक ब्राउज़र के लिए प्रासंगिक नहीं हो सकते हैं। हालांकि, आपको संभवतः गैर-आधुनिक ब्राउज़र का समर्थन करने के लिए इसकी आवश्यकता है और संभवतया उन्हें अपडेट नहीं किया गया है। हमेशा अपने लिए परीक्षण करें।

जैसा कि अन्य ने कहा है, सरणी के माध्यम से पुनरावृत्ति शायद सबसे अच्छा तरीका है, लेकिन यह सिद्ध किया गया है कि एक घटती है while लूप जावास्क्रिप्ट में पुनरावृत्त करने का सबसे तेज़ तरीका है। तो आप निम्नानुसार अपना कोड फिर से लिखना चाहेंगे:

function contains(a, obj) {
    var i = a.length;
    while (i--) {
       if (a[i] === obj) {
           return true;
       }
    }
    return false;
}

बेशक, आप ऐरे प्रोटोटाइप का विस्तार भी कर सकते हैं:

Array.prototype.contains = function(obj) {
    var i = this.length;
    while (i--) {
        if (this[i] === obj) {
            return true;
        }
    }
    return false;
}

और अब आप बस निम्न का उपयोग कर सकते हैं:

alert([1, 2, 3].contains(2)); // => true
alert([1, 2, 3].contains('2')); // => false

357
2017-10-25 22:49



लेकिन सावधान रहना: stackoverflow.com/questions/237104/javascript-array-containsobj/... - MatrixFrog
"सिद्ध" एक मजबूत शब्द है। जेएस इंजन लगातार सुधारते हैं, और 3 साल पहले मापा निष्पादन समय बहुत पुराना है। - orip
@ डेमिर - मैं सहमत हूं। शायद उपलब्ध होने पर इंडेक्स का उपयोग करने के लिए नमूना बदलें, अगर लोग इस कोड को कॉपी-पेस्ट करते हैं तो उन्हें सबसे अच्छा प्रदर्शन मिल जाएगा। - orip
@cbmeeks हाँ, देखभाल निश्चित रूप से जरूरी है। यह शायद करने का एक मामला था for (o in array) जो सरणी के माध्यम से लूपिंग करते समय नहीं किया जाना चाहिए ... - Damir Zekić
ऐसा करने का सबसे अच्छा तरीका यह जांचना है कि [1, 2, 3] .indexOf (1)> -1 - Devin G Rhode


indexOf शायद, लेकिन यह "ईसीएमए -262 मानक के लिए जावास्क्रिप्ट एक्सटेंशन है, क्योंकि यह मानक के अन्य कार्यान्वयन में मौजूद नहीं हो सकता है।"

उदाहरण:

[1, 2, 3].indexOf(1) => 0
["foo", "bar", "baz"].indexOf("bar") => 1
[1, 2, 3].indexOf(4) => -1

AFAICS माइक्रोसॉफ्ट करता है नहीं किसी प्रकार का विकल्प प्रदान करें इसके लिए, लेकिन आप इंटरनेट एक्सप्लोरर (और अन्य ब्राउज़र जो समर्थन नहीं करते हैं) में सरणी के लिए समान कार्यक्षमता जोड़ सकते हैं indexOf) यदि आप एक के रूप में करना चाहते हैं त्वरित Google खोज से पता चलता है (उदाहरण के लिए, यह वाला)।


156
2018-01-01 01:40



असल में, उन ब्राउज़रों के लिए indexOf एक्सटेंशन के कार्यान्वयन का एक उदाहरण है जो आपके द्वारा लिंक किए गए developer.mozilla.org पृष्ठ पर इसका समर्थन नहीं करते हैं। - Lloyd Cotten
असल में, यदि आप उन ब्राउज़र के लिए ऐरे के प्रोटोटाइप में इंडेक्स को जोड़ते हैं जो इसका समर्थन नहीं करते हैं (यानी आईई 7) वे सरणी में आइटम्स के माध्यम से लूप करते समय इस फ़ंक्शन पर लूप करने का प्रयास करेंगे। बुरा। - CpILL
आईई 9 अब इसका समर्थन करता है - Liam
क्या यह ऑब्जेक्ट की जांच के लिए लागू है। मुझे नहीं लगता कि यह ऑब्जेक्ट के मामले में काम करता है - Himesh Aadeshara


ईसीएमएस्क्रिप्ट 7 परिचय Array.prototype.includes

इसका इस्तेमाल इस तरह किया जा सकता है:

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

यह एक वैकल्पिक दूसरे तर्क भी स्वीकार करता है fromIndex:

[1, 2, 3].includes(3, 3); // false
[1, 2, 3].includes(3, -1); // true

भिन्न indexOf, जो उपयोग करता है सख्त समानता तुलना, includes उपयोग की तुलना करता है SameValueZero समानता एल्गोरिदम। इसका मतलब है कि आप यह पता लगा सकते हैं कि किसी सरणी में कोई शामिल है या नहीं NaN:

[1, 2, NaN].includes(NaN); // true

इसके विपरीत भी indexOf, includes गायब सूचकांक को छोड़ नहीं है:

new Array(5).includes(undefined); // true

वर्तमान में यह अभी भी एक मसौदा है लेकिन हो सकता है polyfilledइसे सभी ब्राउज़रों पर काम करने के लिए।


128
2018-03-24 04:59



आईई और माइक्रोस्कोट एज (2015) के लिए समर्थित नहीं है (developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/...) - Adriano Resende
भी प्रासंगिक, ES7 संगतता तालिका (क्रोम की तरह दिखता है अब इसे समर्थन करता है) - styfle
ध्यान देने योग्य है कि यह नोड 6+ में समर्थित है, के अनुसार node.green - Ryan
क्या यह ऑब्जेक्ट की जांच के लिए लागू है। मुझे नहीं लगता कि यह ऑब्जेक्ट के मामले में काम करता है - Himesh Aadeshara


b मूल्य है, और a सरणी है यह वापस आता है true या false:

function(a, b) {
    return a.indexOf(b) != -1
}

96
2017-10-27 00:38



इस भाग में मैं नहीं समझता "!! ~"। और मुझे लगता है कि यह IE8 में काम नहीं करेगा क्योंकि IE8 एरे ऑब्जेक्ट पर indexOf () का समर्थन नहीं करता है। - svlada
"~" एक ऑपरेटर है जो एक संख्या से फर्श, इनवर्टर और घटाता है। इंडेक्स रिटर्न -1 अगर यह विफल हो जाता है, तो "~" -1 "0" में बदल जाता है। "!!" का उपयोग करना बोलेन्स में संख्या बदलती है (!! 0 === झूठी) - william malo
वही प्रदर्शन! = - 1 jsperf.com/indexof-check - aelgoa
बस मेरे मुंह में फेंकने का थोड़ा सा। बिल्कुल अनौपचारिक कोड। - Michael Cole
मैं बूलियन ऑपरेटरों के गैर-व्यावसायिक के प्रभावों के बारे में ज्ञान की कमी को बुलाऊंगा। लेकिन मैं पठनीय कोड के मूल्य के बारे में सहमत हूं, मैं निश्चित रूप से इसे स्पष्ट रूप से लेबल किए गए फ़ंक्शन में लपेटूंगा। और यह वही है जो सबसे प्रमुख जेएस ढांचे करते हैं। - Fx32


यहाँ एक है जावास्क्रिप्ट 1.6 संगत का कार्यान्वयन Array.indexOf:

if (!Array.indexOf)
{
  Array.indexOf = [].indexOf ?
      function (arr, obj, from) { return arr.indexOf(obj, from); }:
      function (arr, obj, from) { // (for IE6)
        var l = arr.length,
            i = from ? parseInt( (1*from) + (from<0 ? l:0), 10) : 0;
        i = i<0 ? 0 : i;
        for (; i<l; i++) {
          if (i in arr  &&  arr[i] === obj) { return i; }
        }
        return -1;
      };
}

65
2017-09-13 17:32



यह बहुत अच्छा लग रहा है, लेकिन थोड़ा उलझन में है: * लाइन 1 और 3 समकक्षों पर परीक्षण नहीं हैं? * प्रोटोटाइप का परीक्षण करने के लिए बेहतर नहीं होगा, और यदि आवश्यक हो तो क्रिया को Array.prototype में जोड़ें? - Avi Flax
वे समान नहीं हैं। [].indexOf के लिए एक शॉर्टेंड है Array.prototype.indexOf। हम पागल-रक्षात्मक जावास्क्रिप्ट प्रोग्रामर सभी लागतों पर मूल प्रोटोटाइप को विस्तारित करने से बचते हैं। - Már Örlygsson
नहीं है [].indexOf एक नई सरणी बनाना और फिर एक्सेस करना indexOf, जबकि Array.prototype.indexOfबस प्रोटोटाइप सीधे उपयोग करता है? - alex
@alex हाँ [].indexOf === Array.prototype.indexOf (फायरबग में इसे आज़माएं), लेकिन इसके विपरीत [].indexOf !== Array.indexOf। - Már Örlygsson


उपयोग:

function isInArray(array, search)
{
    return array.indexOf(search) >= 0;
}

// Usage
if(isInArray(my_array, "my_value"))
{
    //...
}

46
2017-08-27 16:45



x ? true : false आमतौर पर अनावश्यक है। यह यहां पर है। - Ry-♦
@minitech आप क्यों कहते हैं कि यह अनावश्यक है? - Matías Cánepa
array.indexOf(search) >= 0 पहले से ही एक बूलियन है। केवल return array.indexOf(search) >= 0। - Ry-♦
@minitech बहुत धन्यवाद! असल में मुझे नहीं पता था कि ऐसा निर्माण वापस किया जा सकता है। टीआईएल कुछ नया है। - Matías Cánepa
जावास्क्रिप्ट में सचमुच कोई भी निर्माण वापस किया जा सकता है - B T


जावास्क्रिप्ट का विस्तार Array ऑब्जेक्ट वास्तव में एक बुरा विचार है क्योंकि आप नए गुण (अपनी कस्टम विधियों) को पेश करते हैं for-in लूप जो मौजूदा स्क्रिप्ट को तोड़ सकता है। कुछ साल पहले के लेखकों प्रोटोटाइप लाइब्रेरी को इस तरह की चीज़ को हटाने के लिए अपने पुस्तकालय कार्यान्वयन को फिर से इंजीनियर करना था।

यदि आपको अपने पृष्ठ पर चल रहे अन्य जावास्क्रिप्ट के साथ संगतता के बारे में चिंता करने की आवश्यकता नहीं है, तो इसके लिए जाएं, अन्यथा, मैं अधिक अजीब, लेकिन सुरक्षित मुक्त-स्थायी फ़ंक्शन समाधान की अनुशंसा करता हूं।


38
2017-07-18 14:36



मैं असहमत हूं। इस कारण के लिए इन-इन लूपों को सरणी के लिए उपयोग नहीं किया जाना चाहिए। लोकप्रिय जेएस पुस्तकालयों में से एक का उपयोग करते समय इन-इन लूप का उपयोग करना टूट जाएगा - Tomas
क्या यह बंदर पैचिंग माना जाएगा? lol कुछ ऐसे लोग। - cbmeeks


आप उपयोग कर सकते हैं Array.prototype.some ()

const items = [ {a: '1'}, {a: '2'}, {a: '3'} ]

items.some(item => item.a === '3')  // returns true
items.some(item => item.a === '4')  // returns false

इसके विपरीत यह है कि तत्व मिलने के बाद पुनरावृत्ति को निरस्त कर दिया जाता है ताकि अनावश्यक पुनरावृत्ति चक्र बचाए जा सकें।

ध्यान देने योग्य एक बात यह है कि some() सभी जेएस संस्करणों में मौजूद नहीं है: (वेबसाइट से)

कुछ को 5 वें संस्करण में ईसीएमए -262 मानक में जोड़ा गया था; इस तरह के रूप में   मानक के सभी कार्यान्वयन में मौजूद नहीं हो सकता है

आप इसे किसी भी मुद्दे के बिना Node.js में उपयोग कर सकते हैं। यदि आपको सभी ब्राउज़रों का समर्थन करने की आवश्यकता है तो यह पॉलीफिल (उसी लिंक से) है:

if (!Array.prototype.some)
{
  Array.prototype.some = function(fun /*, thisArg */)
  {
    'use strict';

    if (this === void 0 || this === null)
      throw new TypeError();

    var t = Object(this);
    var len = t.length >>> 0;
    if (typeof fun !== 'function')
      throw new TypeError();

    var thisArg = arguments.length >= 2 ? arguments[1] : void 0;
    for (var i = 0; i < len; i++)
    {
      if (i in t && fun.call(thisArg, t[i], i, t))
        return true;
    }

    return false;
  };
}

33
2018-01-07 12:49





एक लाइन:

function contains(arr, x) {
    return arr.filter(function(elem) { return elem == x }).length > 0;
}

21
2017-12-23 15:59



array.filter(e=>e==x).length > 0 के बराबर है array.some(e=>e==x) परंतु some अधिक कुशल है - Apolo


एक सेकंड के लिए बॉक्स से बाहर सोचकर, यदि आप इस कॉल को कई बार बना रहे हैं, तो यह उपयोग करने के लिए बहुत अधिक कुशल है एक सहयोगी सरणी एक हैश फ़ंक्शन का उपयोग करके लुकअप करने के लिए एक मानचित्र।

https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Map


21
2018-06-15 01:15