2013-05-12 3 views
13

में एक मानचित्र के माध्यम से पुनरावृति मैं इस तरह एक संरचना है।जावास्क्रिप्ट

मैं इस लक्ष्य को हासिल करने के लिए एक डबल $ प्रत्येक यात्रा कोशिश कर रहा हूँ, लेकिन कुछ नहीं होता:

$.each(myMap, function (i, val) { 
    $.each(i, function (innerKey, innerValue) { 

     setTimeout(function() { 
      $('#variant').fadeOut("slow", function() { 
       $(this).text(innerKey + "-" + innerValue).fadeIn("slow"); 

      }); 

     }, i * 6000); 

    }); 
}); 

प्रभाव में और बाहर fading है कि मैं प्राप्त करने के लिए जब एक ही मूल्य का उपयोग कर ठीक काम कर रहा है कोशिश कर रहा हूँ के साथ सरणी (ऑब्जेक्ट), लेकिन जब मुझे यहां प्रत्येक कुंजी के लिए एक से अधिक मान होने की आवश्यकता नहीं है।

इस पुनरावृत्ति को सफलतापूर्वक पूरा करने के तरीके के बारे में कोई भी विचार और क्या इस मामले में बेहतर होने वाले मानचित्र का उपयोग करने के अन्य तरीके हैं?

कोई भी सुझाव ब्याज का होगा।

+0

यह 'मानचित्र' नहीं है, बल्कि 'ऑब्जेक्ट' है। –

उत्तर

3

$.each() पर कॉलबैक उस क्रम में संपत्ति का नाम और मूल्य पारित कर दिया गया है। इसलिए आप $.each() पर आंतरिक कॉल में संपत्ति के नामों पर फिर से प्रयास करने की कोशिश कर रहे हैं। मुझे लगता है कि आप चाहते हैं:

$.each(myMap, function (i, val) { 
    $.each(val, function(innerKey, innerValue) { 
    // ... 
    }); 
}); 

आंतरिक लूप में, आपके मानचित्र की तरह एक वस्तु दी गई, मान सरणी हैं। यह ठीक है, लेकिन ध्यान दें कि "आंतरिक कुंजी" मान सभी संख्याएं होंगी।

setTimeout(function() { 

     // ... 

    }, i * 6000); 

कि लूप के माध्यम से पहली बार, "मैं" स्ट्रिंग "partnr1" हो जाएगा:

संपादित — अब एक बार है कि बाहर सीधा है, यहाँ अगले समस्या है। इस प्रकार, गुणात्मक प्रयास के परिणामस्वरूप NaN होगा। आप बाहरी मानचित्र की संपत्ति गिनती का ट्रैक रखने के लिए एक बाहरी काउंटर रख सकते हैं:

for (var m in myMap){ 
    for (var i=0;i<myMap[m].length;i++){ 
    ... do something with myMap[m][i] ... 
    } 
} 

नोट वस्तुओं और सरणियों के उपचार के विभिन्न तरीकों:

var pcount = 1; 
$.each(myMap, function(i, val) { 
    $.each(val, function(innerKey, innerValue) { 
    setTimeout(function() { 
     // ... 
    }, pcount++ * 6000); 
    }); 
}); 
+0

उत्तर के लिए धन्यवाद। $ .each (i ... से $ .each (val .. ऊपर .. मेरा कोड इस तरह से काम कर रहा है कि यह परिणाम दिखा रहा है। लेकिन दुर्भाग्यवश यह केवल मानचित्र से अंतिम परिणाम दिखा रहा है, इसलिए यह सीधे कूद रहा है अंतिम पुनरावृत्ति। – user2374903

+0

@ user2374903 नहीं, यह आखिरी बार कूद नहीं रहा है, हालांकि ऐसा लगता है। मैंने "सेटटाइमआउट" कॉल पर बारीकी से नहीं देखा था, इसलिए मैं अपने उत्तर में जोड़ूंगा। – Pointy

+0

बदलकर 1 से 0 तक का पकाउंट (जिसका अर्थ है कि यह पहले लूप से शुरू होता है) कोड काम करता है, लेकिन केवल मॉडल को एक-एक करके दिखाता है।यह स्पष्ट करने के लिए मेरी गलती, लक्ष्य उन सभी मॉडलों को प्राप्त करना है जो उस अंश संख्या से मेल खाते हैं जो सूची में मधुमक्खियों की सूची में दिख रहे हैं। – user2374903

24

मैं मानक जावास्क्रिप्ट का उपयोग करेंगे।

+1

क्यों? और आपने आवश्यक बंद कर दिया ... – Bergi

+0

यह तेज़ और मेरी राय क्लीनर में है। और मैंने बाकी को छोड़ दिया क्योंकि यह मेरे लिए अस्पष्ट है कि यह क्या करना है। # वैरिएंट क्या है? # Variant क्या करना चाहिए? – Atle

+0

#variant एक div की एक आईडी है जो मानचित्र से जानकारी के साथ दिखाया जा रहा है (फीका हुआ)। प्रत्येक partnr के लिए corrensponding मॉडल के साथ एक सूची में फीका होना चाहिए। – user2374903

1

ऐसा करने के लिए इटरेटर का उपयोग न करें। कॉलबैक में काउंटर बढ़ाने और अपने आइटम को अगले आइटम पर दोबारा कॉल करके अपना खुद का लूप बनाए रखें।

$.each(myMap, function(_, arr) { 
    processArray(arr, 0); 
}); 

function processArray(arr, i) { 
    if (i >= arr.length) return; 

    setTimeout(function() { 
     $('#variant').fadeOut("slow", function() { 
      $(this).text(i + "-" + arr[i]).fadeIn("slow"); 

      // Handle next iteration 
      processArray(arr, ++i); 
     }); 
    }, 6000); 
} 

वहाँ अपने कोड में एक तर्क त्रुटि है हालांकि। आप एक ही कंटेनर को एक ही समय में (लगभग) एक से अधिक अलग मान पर सेट कर रहे हैं। शायद आप प्रत्येक के लिए अपने कंटेनर को अद्यतन करने के लिए मतलब है।

+0

सुझाव के लिए धन्यवाद। मैंने आपको कोड की कोशिश की है, लेकिन आप इसके बारे में सही हैं कंटेनर के साथ एक समस्या है। नीचे दिया गया कोड हालांकि काम करता है, लेकिन यहां इसकी केवल एक ही मान सरणी है: – user2374903

+0

यह ऐसा करने का एक अच्छा तरीका है। – Pointy

+0

$ .each (jArray, function (i, val) { सेटटाइमआउट (फ़ंक्शन() { $ ('# reklame2')। FadeOut ("slow", function() { $ (this) .text (val) .fadeIn ("धीमी"); \t \t \t \t \t}); \t \t \t \t \t $ { $ (this) .text (वैल ('# reklame17') fadeOut ("धीमी", समारोह (।)) .fadeIn ("धीमी"); \t \t \t \t \t }); }, मैं * 6000); \t \t \t }); – user2374903

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