2012-05-13 13 views
9

के माध्यम से पुनरावृत्ति मैं एक विरल सरणी (अनुक्रमित लगातार नहीं हैं) इस तरह है:जावास्क्रिप्ट विरल सरणी

var testArray = { 0: "value1", 5: "value2", 10: "value3", 15: "value4" }; 

मैं बस प्रत्येक आइटम के माध्यम से पुनरावृति, कुछ सामान करते हैं, और एक के तहत तोड़ने में सक्षम होना चाहते हैं निश्चित परिस्थिति।

मैं जावास्क्रिप्ट के लिए बिल्कुल नया हूं और मुझे इसे करने का उचित तरीका नहीं मिला। यहां मैंने कोशिश की है:

  1. अंतर्निहित "for..in"। ऐसा लगता है कि यह not the correct way to iterate through an array

  2. forEach ECMASCRIPT5 से है। यह सही ढंग से पुनरावृत्त है, लेकिन मैं लूप से नहीं तोड़ सकता।

  3. _.each() Underscore.js से। # 2 के समान परिणाम।

  4. $.each() JQuery से। इस के साथ मैं झूठी वापसी करके तोड़ सकता हूं, लेकिन यह सही ढंग से पुन: सक्रिय नहीं होगा। उपर्युक्त उदाहरण के लिए, 0, 5, 10, 15 पर पुनरावृत्त करने के बजाय, यह 0,1,2,3,4,5,6 पर फिर से शुरू हो जाएगा ... जो स्पष्ट रूप से मैं अपेक्षा नहीं करता हूं।

तो मेरे सवाल है: वहाँ एक आसान तरीका जावास्क्रिप्ट में पाश के दौरान तोड़ने के लिए संभावना के साथ एक विरल सरणी पुनरावृति करने के लिए है या यह एक hashtable की तरह एक और डेटा संरचना का उपयोग करने के बेहतर होगा? यदि हां, तो कोई सिफारिश?

धन्यवाद!

+1

यदि आप बिंदु # 1 में दिए गए लिंक को देखते हैं, तो अंतर्निहित ..in लूप एक ऑब्जेक्ट गुणों के माध्यम से लूप करने का तरीका है, जो आपके पास – anson

+0

है जो मुझे लिंक से समझा गया था यदि कोई लाइब्रेरी Array.prototype में सदस्य जोड़ती है तो एक समस्या संभावित रूप से हो सकती है। तब सदस्य "for..in" लूप का हिस्सा होगा। – Absolom

+0

आह ठीक है, मेरा उदाहरण वैध नहीं था क्योंकि मैं ऑब्जेक्ट का उपयोग कर रहा था और एक ऐरे नहीं था। तो आपकी टिप्पणी सही है। – Absolom

उत्तर

6

for...in वाक्यविन्यास के साथ क्या गलत है?

var testArray = { 0: "value1", 5: "value2", 10: "value3", 15: "value4" }; 

for (var key in testArray) { 
    var value = testArray[key]; 

    if (...) { 
    break; 
    } 
} 
+0

उत्तर के लिए धन्यवाद। लेकिन अगर मैं किसी वस्तु के बजाय असली ऐरे का उपयोग करना चाहता था? तब आप क्या उपयोग करेंगे? – Absolom

+0

@ एब्सोलॉम जेएस Arrays ऑब्जेक्ट से विरासत में है, तो यह अभी भी ठीक काम करेगा। – mikemaccana

+3

for..in गारंटी आदेश है? –

1

for..in सबसे बुरी बात है जब आप एक वस्तु हैश पर काम कर रहे नहीं है: इसलिए for...in वाक्य रचना पूरी तरह से उपयोग करने के लिए मान्य है आप एक वस्तु है। यह सरणियों ([]) के साथ उपयोग के लिए परहेज किया जाता है, लेकिन यह यहाँ ठीक किया जाना चाहिए:

var val; 
for (index in testArray) { 
    if (index == 10) { 
    break; 
    } else { 
    val = testArray[index]; 
    } 
} 
2

पहली बात आप चुंबन अलविदा अलविदा करने के लिए "सरणी" है। ईसीएमएस्क्रिप्ट में कोई वास्तविक Array नहीं है (टाइप-एरे और बाइनरी ट्रिकरी के बारे में भूलना)।

तो आपको जो मिला है वह एक सादा Object है। उस पर पुन: प्रयास करने के लिए, यदि आप ES5 के साथ अच्छे हैं तो मैं .forEach का उपयोग करने का सुझाव दूंगा। जब एक चाबी का सामना करना पड़ा है जो संख्यात्मक मूल्य, 15 की तुलना में कम नहीं है द्वारा

Object.keys(testArray).some(function(key) { 
    if(+key < 15) {    
     return true; 
    } 

    console.log(key, testArray[key]); 
}); 

यह यात्रा interrup होगा: आप जल्दी है कि यात्रा को तोड़ने की जरूरत है, तो आप .some() या .every() तरह ES5 विधियों का उपयोग करना चाहते हो सकता है की तरह true लौट रहा है।

0

आपके पास कोई सरणी नहीं है, यह केवल एक वस्तु है।

आप द्वारा परीक्षण कर सकते हैं:

Array.isArray(testArray) 

के लिए क्या लायक है, JavaScript श्रृंखला विरल होने के लिए कहा जाता है कि करता है।ऐसा तब होता है जब आप delete ऑपरेटर का उपयोग किसी तत्व को निकालने या लंबाई में बड़ी संपत्ति को बदलने के लिए करते हैं।

किसी ऑब्जेक्ट के माध्यम से लूप करने के लिए अपने प्रश्न का उत्तर देने के लिए, सबसे अच्छा तरीका Object.keys(obj).forEach() है।

var o = {"a":3, "b":4}; 

Object.keys(o).forEach(
    function (key) { 
     var val = o[key]; 
     console.log("Key:" + key); 
     console.log("Value:" + val); 
    } 
); 

संभव मुद्दा for (var p in o) {…} साथ है कि यह भी माता-पिता में किसी भी गणनीय गुण (कि, प्रोटोटाइप श्रृंखला है) के माध्यम से पाश। आम तौर पर यह तब नहीं होगा, यदि आप शाब्दिक अभिव्यक्ति var obj = {...} द्वारा ऑब्जेक्ट को परिभाषित करते हैं, जो डिफ़ॉल्ट रूप से इसके माता-पिता ऑब्जेक्ट.प्रोटोटाइप है, और इसमें कोई गणना करने योग्य गुण नहीं हैं।

संबंधित मुद्दे