यदि एक निश्चित सरणी इंडेक्स पर कोई मान मौजूद है, तो मैं जावास्क्रिप्ट में कैसे जांच कर सकता हूं?


521

क्या यह परीक्षण करने के लिए काम करेगा कि क्या "इंडेक्स" स्थिति में मौजूद है या नहीं, या इसका कोई बेहतर तरीका है:

if(arrayName[index]==""){
     // do stuff
}

6
कृपया ध्यान दें, यह जांचना नहीं चाहते हैं कि क्या पूरा सरणी खाली है, बस एक निश्चित स्थान है, जिसमें "इंडेक्स" का सूचकांक मान है
अंकुर

शीर्षक को यह कहकर सुधारा जा सकता है कि "मैं जावास्क्रिप्ट में कैसे जांच कर सकता हूं यदि एक निश्चित सरणी इंडेक्स में मान मौजूद है"।
डेमएक्स

जवाबों:


738

वैचारिक रूप से, जावास्क्रिप्ट में सरणियों में array.lengthतत्व होते हैं, जो array[0]तब तक शुरू होते हैं array[array.length - 1]। सूचकांक के साथ एक सरणी तत्व को सरणी के iभाग के रूप में परिभाषित किया जाता है यदि iबीच 0और array.length - 1समावेशी हो। अगर मैं इस श्रेणी में नहीं हूँ तो यह सरणी में नहीं है।

तो अवधारणा से, सरणियाँ रैखिक हैं, शून्य से शुरू होती हैं और अधिकतम तक जाती हैं, उस सीमा के अंदर "अंतराल" होने के लिए बिना किसी तंत्र के जहां कोई प्रविष्टियां मौजूद नहीं हैं। यह पता लगाने के लिए कि क्या किसी दिए गए स्थिति सूचकांक (जहां सूचकांक 0 या एक सकारात्मक पूर्णांक है) पर एक मूल्य मौजूद है, आप सचमुच केवल उपयोग करते हैं

if (i >= 0 && i < array.length) {
  // it is in array
}

अब, हुड के तहत, जावास्क्रिप्ट इंजन लगभग निश्चित रूप से इस तरह से सरणी स्थान को रैखिक रूप से और सन्निहित रूप से आवंटित नहीं करेंगे, क्योंकि यह एक गतिशील भाषा में बहुत अधिक समझ में नहीं आएगा और यह निश्चित कोड के लिए अक्षम होगा। वे शायद हैश टेबल या रणनीतियों के कुछ हाइब्रिड मिश्रण, और सरणी की अपरिभाषित श्रेणियां शायद अपनी खुद की स्मृति आवंटित नहीं करते हैं। बहरहाल, जावास्क्रिप्ट भाषा की वर्तमान सरणियों करना चाहता है array.length n होने के रूप में एन के सदस्यों और वे नाम हैं 0 करने के लिए n - 1 , और इस श्रेणी में कुछ भी सरणी का हिस्सा है।

हालांकि, आप जो चाहते हैं, वह यह जानना है कि किसी सरणी में मूल्य वास्तव में कुछ परिभाषित है - अर्थात यह नहीं है undefined। शायद आप यह भी जानना चाहते हैं कि यह परिभाषित है या नहींnull । किसी सदस्य को कभी भी उनके मान को सेट किए बिना एक सरणी में जोड़ना संभव है: उदाहरण के लिए, यदि आप array.lengthसंपत्ति बढ़ाकर सरणी मान जोड़ते हैं, तो कोई भी नया मान होगा undefined

यह निर्धारित करने के लिए कि दिया गया मूल्य कुछ सार्थक है, या परिभाषित किया गया है। वह है, या नहीं :undefinednull

if (typeof array[index] !== 'undefined') {

या

if (typeof array[index] !== 'undefined' && array[index] !== null) {

दिलचस्प बात यह है कि जावास्क्रिप्ट के तुलना नियमों के कारण, मेरे अंतिम उदाहरण को इसके लिए अनुकूलित किया जा सकता है:

if (array[index] != null) {
  // The == and != operators consider null equal to only null or undefined
}  

6
यह अत्यधिक संभावना है कि ओपी जानता है कि किस प्रकार की सरणी है / वह किसके साथ काम कर रहा है, लेकिन सिर्फ पूर्णता के लिए: सरणी जैसी वस्तुओं में भी आमतौर पर एक lengthसंपत्ति होती है, इस मामले में बाद के दो उदाहरण अधिक उपयुक्त हैं।
जस्टिन जॉनसन

9
आप हमेशा की जगह ले सकता foo !== 'undefined' && foo !== nullहै बस के साथfoo != null
thinklinux

1
@ TheComposer भाषा के अनुसार जावास्क्रिप्ट में एक सरणी का आकार array.length द्वारा परिभाषित किया गया है, और सरणी को सभी तत्वों को शामिल करने के लिए कहा जाता 0है array.length - 1। हालांकि ये सभी मूल्य परिभाषित मूल्य नहीं होंगे। यदि आप किसी सरणी सदस्य पर हटाए गए कीवर्ड का उपयोग करते हैं तो यह उस सदस्य को वापस अपरिभाषित कर देगा, जैसे यदि आप किसी सरणी को उसके array.length पैरामीटर को बढ़ाकर बढ़ाते हैं, तो नए मान अपरिभाषित हो जाएंगे। वास्तव में, जावास्क्रिप्ट कार्यान्वयन संभवतः सरणी भंडारण को अनुकूलित करेगा और कुछ या सभी अपरिभाषित मानों पर कोई मेमोरी नहीं हो सकती है।
थोमसट्रेटर

1
array.length किसी भी चीज पर पुनरावृति नहीं करती है, यह सिर्फ एक ही संख्या है।
थोमसट्रेटर

1
यह उत्तर उन मामलों को कवर नहीं करता है जहां एक सरणी सूचकांक सेट नहीं है। new Array(1)[0] === undefinedलेकिन मान खाली है। [undefined][0] === undefinedलेकिन मूल्य निर्धारित है; सरणी में एक मान है। केवल सही जवाब उपयोग कर रहा है inया hasOwnProperty()- idx in arrayया array.hasOwnProperty(idx)इस जवाब --per: stackoverflow.com/a/39171620/3120446
dx_over_dt

350

क्या हम ऐसा नहीं कर सकते:

if(arrayName.length > 0){   
    //or **if(arrayName.length)**
    //this array is not empty 
}else{
   //this array is empty
}

10
सवाल यह था कि किसी सरणी के किसी विशेष सूचकांक के मौजूद होने या न होने का परीक्षण कैसे किया जाए ।
थोमसट्रेटर

26
चाहेंगे if(arrayName.length) {...कोई फर्क?
सियानोनोन

10
इतने अपवित्र क्यों? यह स्पष्ट रूप से प्रश्न का उत्तर नहीं देता है।
एल्गीओगिया

10
if(arrayName.length) {...विफल रहता हैnull
रॉनी रोस्टन 5

5
यह विफल रहता है [undefined, undefined]जिसमें लंबाई = 2. के साथ एक सरणी है
सोल्पेप्लाटा साकेतोस

41

केवल .lengthका उपयोग करना सुरक्षित नहीं है और कुछ ब्राउज़रों में त्रुटि का कारण होगा। यहाँ एक बेहतर समाधान है:

if(array && array.length){   
   // not empty 
} else {
   // empty
}

या, हम उपयोग कर सकते हैं:

Object.keys(__array__).length

2
«कृपया ध्यान दें, यह जांचना नहीं चाहते हैं कि क्या पूरी सरणी खाली है, बस एक निश्चित स्थान है, जिसमें" इंडेक्स "का सूचकांक मान है»
उड़ोल

उन लोगों के लिए अच्छा, छोटा और सरल उत्तर है जो पूरे ऐरे को देखना चाहते हैं
लुइस मार्टिंस

23
if(!arrayName[index]){
     // do stuff
}

8
यह भी सामान करेगा अगर सरणी मान मौजूद है, लेकिन 0, अशक्त, "", आदि है
थोमैसर्रिट

थॉमस सही है; हालांकि, यह कई मामलों के लिए पर्याप्त है (जो आपको संभवतः गणना करना चाहिए)।
जस्टिन जॉनसन

अब तक का सबसे सरल तरीका है
ब्रेकर

8
if(arrayName.length > index && arrayName[index] !== null) {
    //arrayName[index] has a value
}

@thomasrutter मुझे परेशानी हो रही है एक तरह से यह अपरिभाषित है कि एक सरणी तत्व के साथ समाप्त करना संभव होगा।
रेक्स एम

हम्म, (मायार्रे [1] = अपरिभाषित) काम करता है? या बस (मायार्रे [1] = अपरिभाषित)?
थोमसट्रेटर

@thomasrutter उन दोनों को एक अपवाद फेंक देंगे, नहीं? (अपरिभाषित अपरिभाषित है)
रेक्स एम

1
आप फायरबग जैसी किसी चीज़ का उपयोग करके अपने लिए इसका परीक्षण कर सकते हैं। जावास्क्रिप्ट में, अपरिभाषित चर का मान पढ़ने से अपवाद नहीं होता है - यह अपरिभाषित मान लौटाता है।
थोमसट्रेटर

@thomasrutter आप अपनी पहली टिप्पणी में गलत हैं। x == nullकेवल अशक्त या अपरिभाषित के लिए ही सही होगा, और कुछ नहीं। इसी तरह, ऐसी x != nullकिसी भी चीज़ के लिए सही होगा जो न तो अशक्त है और न ही अपरिभाषित। जब तक आपको विशेष रूप से अपरिभाषित दिखने की जरूरत नहीं है, तब तक निहित रूपांतरण अच्छाई के लिए दुबले हो जाएं।
मार्कस स्टेड

8

संक्षिप्त और सार्वभौमिक दृष्टिकोण

यदि आप किसी भी सरणी की जाँच करना चाहते हैं, यदि उसमें गलत मान हैं (जैसे गलत, अपरिभाषित, अशक्त या रिक्त तार) तो आप इस तरह से हर () विधि का उपयोग कर सकते हैं :

array.every(function(element) {return !!element;}); // returns true or false

उदाहरण के लिए:

['23', null, 2, {key: 'value'}].every(function(element) {return !!element;}); // returns false

['23', '', 2, {key: 'value'}].every(function(element) {return !!element;}); // returns false

['23', true, 2, {key: 'value'}].every(function(element) {return !!element;}); // returns true

यदि आपको मिथ्या मूल्य का पहला सूचकांक प्राप्त करने की आवश्यकता है, तो आप इसे इस तरह से कर सकते हैं:

let falsyIndex; 

if(!['23', true, 2, null, {key: 'value'}].every(function(element, index) {falsyIndex = index; return !!element;})) {
  console.log(falsyIndex);
} // logs 3

यदि आपको किसी दिए गए इंडेक्स के लिए किसी सरणी के गलत मान की जाँच करने की आवश्यकता है, तो आप इसे इस तरह कर सकते हैं:

if (!!array[index]) {
  // array[index] is a correct value
}
else {
  // array[index] is a falsy value
}

6
if(typeof arr ==='object' && arr instanceof Array ){
   if(!arr.length){
      println 'empty'
   }else{
      printn 'not Empty'
   }

}else{
   println 'Null'
}

यदि आप 'Null' से मतलब रखते हैं -> इसके तत्व शून्य हैं या '' के बराबर हैं, तो इस स्थिति में: सभी 'null' तत्वों को फ़िल्टर करने के बाद सरणी खाली है या नहीं, इसकी जांच करें

if(!arr.clean().length){return 'is null'}

बेशक, इससे पहले स्वच्छ विधि जोड़ें :

Array.prototype.clean=function(){return this.filter(function(e){return (typeof  e !=='undefined')&&(e!= null)&&(e!='')})}

5

मैं इस तरह एक समारोह बनाने की सिफारिश करेंगे:

function isEmptyEl(array, i) {
   return !(array[i]);
}

आप इसे इस तरह कह सकते हैं:

if (isEmptyEl(arrayName, indexVal)) {
   console.log('arrayName[' + indexVal + '] is empty');
}

डेवलपर को मजबूर करने के लिए isEmptyEl इंटरफ़ेस का पालन करना अपरिभाषित सरणी नाम या indexVal चर जैसे इनपुट त्रुटियों को पकड़ लेगा।

(यह आमतौर पर जावास्क्रिप्ट में प्रोग्रामिंग करते समय रक्षात्मक रूप से प्रोग्राम करने का अच्छा अभ्यास है।)

अगर सरणी नाम परिभाषित नहीं किया गया था तो आपको इस तरह से एक त्रुटि मिलेगी:

Uncaught ReferenceError: arrayName is not defined
    at <anonymous>:2:15
    at Object.InjectedScript._evaluateOn (<anonymous>:895:140)
    at Object.InjectedScript._evaluateAndWrap (<anonymous>:828:34)
    at Object.InjectedScript.evaluate (<anonymous>:694:21)

एक अपरिभाषित इंडेक्सवैल के लिए समान परिणाम।

यदि सरणी या अनुक्रमणिका मान मौजूद नहीं है, तो आपको एक त्रुटि मिलती है।

मान्य इनपुट के लिए, आपको केवल एक सच मिलेगा यदि arrayName [indexVal] निम्नलिखित में से कोई है:

  • शून्य
  • अपरिभाषित
  • NaN
  • खाली स्ट्रिंग
  • 0
  • असत्य

5

यह निर्भर करता है कि आप "खाली" के साथ क्या मतलब है।

जब आप किसी ऐसी संपत्ति पर मूल्य प्राप्त करने का प्रयास करते हैं, जिसमें उस नाम की कोई संपत्ति नहीं है, तो आपको मूल्य मिलेगा undefined

विरल सरणियों के साथ ऐसा ही होता है: सभी सूचकांकों के बीच 0और नहींarray.length-1 मौजूद होते हैं।

तो अगर आप जाँच कर सकते हैं array[index] === undefined

हालांकि, संपत्ति indexएक undefinedमूल्य के साथ मौजूद हो सकती है । यदि आप इस मामले को फ़िल्टर करना चाहते हैं, तो आप inऑपरेटर का उपयोग कर सकते हैं या hasOwnProperty, जैसा कि वर्णित है कि कैसे मैं जाँच सकता हूं कि किसी ऑब्जेक्ट की जावास्क्रिप्ट में संपत्ति है या नहीं?

index in array;
array.hasOwnProperty(index);

यदि आप मौजूदा संपत्ति पर विचार करना चाहते हैं undefinedया nullमौजूद नहीं हैं, तो आप ढीली तुलना का उपयोग कर सकते हैं array[index] == undefinedया कर सकते हैंarray[index] == null

क्या आप जानते हैं सरणी विरल नहीं है, तो आप तुलना कर सकते हैं indexके साथ array.length। लेकिन सुरक्षित होने के लिए, आप यह सुनिश्चित करना चाह सकते हैं कि indexवास्तव में एक सरणी सूचकांक है, देखें कि क्या संपत्ति का नाम सरणी सूचकांक है


2
यह एकमात्र ऐसा उत्तर है जो ठीक से अनसेट ऐरर आइटम (जिसमें कोई मूल्य नहीं है) और जिन वस्तुओं को अपरिभाषित मान पर सेट किया गया है, के बीच ठीक से अंतर करता है। 2 राज्य इस तथ्य से धुंधला हो जाते हैं कि एक बेकार सरणी आइटम तक पहुंचना अपरिभाषित है, लेकिन वे अलग हैं।
ओलिव्र

जब आपके पास संभावित अनसेट वैल्यू (अपरिभाषित या अशक्त से अलग) के साथ एक सरणी हो, तो OOnnProperty का उपयोग करें।
CMCDragonkai

1

ठीक है, आइए पहले देखें कि क्या होगा यदि कोई सरणी मान जावास्क्रिप्ट में मौजूद नहीं है, इसलिए यदि हमारे पास नीचे की तरह एक सरणी है:

const arr = [1, 2, 3, 4, 5];

और अब हम जांचते हैं कि सूचकांक 5 में 6 है या नहीं:

arr[5];

और हम प्राप्त करते हैं undefined...

तो यह मूल रूप से हमें जवाब दे सकता है, अगर अपरिभाषित है तो जांचने का सबसे अच्छा तरीका है, इसलिए कुछ इस तरह है:

if("undefined" === typeof arrayName[index]) {
  //array value is not there...
}

इस मामले में ऐसा करना बेहतर नहीं है :

if(!arrayName[index]) {
  //Don't check like this..
}

क्योंकि कल्पना करें कि हमारे पास यह सरणी है:

const arr = [0, 1, 2];

और हम करते हैं:

if(!arr[0]) {
  //This get passed, because in JavaScript 0 is falsy
}

तो जैसा कि आप देखते हैं, यहां तक ​​कि 0 भी है, यह मान्यता प्राप्त नहीं है, कुछ अन्य चीजें हैं जो ऐसा ही कर सकती हैं और आपको आवेदन छोटी गाड़ी बना सकती हैं, इसलिए सावधान रहें, मैं उन्हें नीचे सूचीबद्ध करता हूं:

  1. अपरिभाषित : यदि मान परिभाषित नहीं है और यह हैundefined
  2. null : यदि यह शून्य है, उदाहरण के लिए यदि DOM तत्व मौजूद नहीं है ...
  3. खाली स्ट्रिंग :''
  4. 0 : संख्या शून्य
  5. NaN : एक संख्या नहीं
  6. असत्य

1

मैं कुछ याद दिलाना चाहता हूं: अर्थात् आपके सरणी के बीच में "खाली" सरणी स्थिति होना संभव है। निम्नलिखित को धयान मे रखते हुए:

let arr = [0, 1, 2, 3, 4, 5]

delete arr[3]

console.log(arr)      // [0, 1, 2, empty, 4, 5]

console.log(arr[3])   // undefined

जाँच करने का स्वाभाविक तरीका तब यह देखना होगा कि क्या सरणी सदस्य अपरिभाषित है, यदि अन्य तरीके मौजूद हैं तो मैं अनिश्चित हूँ

if (arr[index] === undefined) {
  // member does not exist
}

0

यह प्रयास करें यदि सरणी [सूचकांक] शून्य है

if (array[index] != null) 

0

लोदाश के साथ, आप कर सकते हैं:

if(_.has(req,'documents')){
      if (req.documents.length)
      _.forEach(req.documents, function(document){
        records.push(document);
      });
} else {
}

if(_.has(req,'documents'))यह जाँचने के लिए कि हमारी अनुरोध वस्तु में कोई संपत्ति है या नहीं documentsऔर यदि उसमें वह प्रस्ताव है, तो अगला if (req.documents.length)यह मान्य करना है कि क्या वह खाली सरणी नहीं है, इसलिए अन्य सामान forEachको आगे बढ़ाया जा सकता है।


0

यह जाँचने के लिए कि क्या इसे कभी परिभाषित नहीं किया गया है या यदि इसे हटा दिया गया है:

if(typeof arrayName[index]==="undefined"){
     //the index is not in the array
}

आप साहचर्य सरणियों और सरणियों के साथ भी काम करते हैं जहां आपने कुछ सूचकांक हटाए हैं

यह जाँचने के लिए कि क्या इसे कभी परिभाषित नहीं किया गया था, हटा दिया गया था या एक शून्य या तार्किक खाली मान है (NaN, खाली स्ट्रिंग, गलत):

if(typeof arrayName[index]==="undefined"||arrayName[index]){
     //the index is not defined or the value an empty value
}

0

मैं इस मुद्दे में लार्वा डेटेटेबल्स का उपयोग करके भाग गया। मैं नामक JSON मान संग्रहीत कर रहा थाproperties को एक गतिविधि लॉग में और इस मूल्य के खाली होने या न होने के आधार पर एक बटन दिखाना चाहता था।

ठीक है, डेटाटैबल्स इसे एक सरणी के रूप में व्याख्या कर रहा था यदि यह खाली था, और एक वस्तु अगर यह नहीं थी, इसलिए, निम्न समाधान ने मेरे लिए काम किया:

render: function (data, type, full) {
    if (full.properties.length !== 0) {
        // do stuff
    }
}

एक वस्तु की लंबाई संपत्ति नहीं है।


0

मुझे लगता है कि यह निर्णय उन लोगों के लिए उपयुक्त है जो अनिवार्य OOP या प्रक्रियात्मक पर घोषणात्मक कार्यात्मक प्रोग्रामिंग पसंद करते हैं। यदि आपका प्रश्न है " क्या कुछ मूल्य हैं? (एक सत्य या मिथ्या मूल्य)" तो आप .someअंदर के मूल्यों को मान्य करने के लिए विधि का उपयोग कर सकते हैं ।

[].some(el => el || !el);
  • यह सही नहीं है, लेकिन इसे किसी भी अतिरिक्त फ़ंक्शन को लागू करने की आवश्यकता नहीं है, जैसे तर्क function isEmpty(arr) { ... }
  • यह अभी भी "क्या यह शून्य लंबाई है" से बेहतर लगता है ? जब हम ऐसा करते हैं [].lengthकरने के लिए परिणामी0 कुछ मामलों में खतरनाक है।
  • या यहां तक ​​कि यह [].length > 0कहते हुए कि "क्या इसकी लंबाई शून्य से अधिक है?"

उन्नत उदाहरण:

[    ].some(el => el || !el); // false
[null].some(el => el || !el); // true
[1, 3].some(el => el || !el); // true

-1

आप इसे अधिक कुशलता से करने के लिए लोडश लाइब्रेरी का उपयोग कर सकते हैं, जैसे:

यदि आपके पास "पालतू जानवर" नामक एक सरणी है, उदाहरण के लिए:

var pets = ['dog', undefined, 'cat', null];

console.log(_.isEmpty(pets[1])); // true
console.log(_.isEmpty(pets[3])); // true
console.log(_.isEmpty(pets[4])); // false

_.map( pets, (pet, index) => { console.log(index + ': ' + _.isEmpty(pet) ) });

अशक्त या अपरिभाषित मानों के लिए सभी सरणी मानों की जाँच करने के लिए:

var pets = ['dog', undefined, 'cat', null];

console.log(_.isEmpty(pets[1])); // true
console.log(_.isEmpty(pets[3])); // true
console.log(_.isEmpty(pets[4])); // false

_.map( pets, (pet, index) => { console.log(index + ': ' + _.isEmpty(pet) ) });
<script src="https://cdnjs.cloudflare.com/ajax/libs/underscore.js/1.8.3/underscore-min.js"></script>

Http://underscorejs.org/ में और उदाहरण देखें


fn(){}एक वाक्यविन्यास त्रुटि है, और यह बिल्कुल स्पष्ट नहीं है कि यह कैसे जाँचता है कि एक सरणी आइटम एक निश्चित सूचकांक पर मौजूद है या नहीं।
ओरिऑल
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.