मेरे पास १०० “XYCoordinate” ऑब्जेक्ट्स की एक सरणी है, और मैं उनमें से २५ को बेतरतीब ढंग से चुनना चाहता हूं और उन्हें २५ "Cube" ऑब्जेक्ट्स को असाइन करना चाहता हूं ताकि मैं उन क्यूब्स को इस पर प्रस्तुत कर सकूं विभिन्न स्थानों में स्क्रीन।

जाहिर है मुझे यह सुनिश्चित करने की ज़रूरत है कि मैं गलती से एक ही XYCoordinate को दो बार नहीं चुनता और इसे दो अलग-अलग क्यूब ऑब्जेक्ट्स को असाइन नहीं करता - क्योंकि तब वे शीर्ष पर बैठेंगे एक दूसरे की।

मैंने सोचा था कि निम्न कोड काम करेगा, लेकिन मुझे अभी भी डुप्लीकेट मिल रहे हैं:

   // I first declare an array to store the randomly selected XYCoordinate objects:
   var selectedCoordObjectsArray = [];

   // I then declare a second array to store just the INDEXES of the Coords that 
   // were already randomly selected:
   var selectedCoordIDNumbersArray = [];
    
        
   // Next I make a function to randomly select one XYCoordinate object:
   function selectRandomXYCoordinateObject() {
       let randomCoordNumber = Math.floor(Math.random() * 100);

       // Check if this Coord-number was already selected:
       if(selectedCoordIDNumbersArray.includes(randomCoordNumber)) {
           // A Coord of this ID was already selected!
           console.log(“Duplicate!”);
           // Immediately call this function again:
           selectRandomXYCoordinateObject();
       }
       else { 
          // Grab this Coord from my previously declared “coordsArray”:
          let chosenCoord = coordsArray[randomCoordNumber];
          // Add the INDEX of this Coord to the “selectedCoordIDNumbersArray”:
          selectedCoordIDNumbersArray.push(randomCoordNumber);
          // Finally, return the actual “chosenCoord” object: 
          return chosenCoord;
       }
   } 

यहां मैं इस फ़ंक्शन को कॉल करता हूं:

   function makeCubes() {
       for(var cubeCounter = 0; cubeCounter < 25; cubeCounter++) {
          let tempCube = cubesArray[cubeCounter];
          // prep the Cube, give it different Width & Height, Color, etc. 
          // Then, assign to it a random coordinate: 
          tempCube.coords = selectRandomXYCoordinateObject();
            
          // an then display the “tempCube” at those coords:
           . . .
       }
   } 

तो क्या हो रहा है कि हर बार selectRandomXYCoordinateObject फ़ंक्शन डुप्लिकेट पर आता है - ऐप क्रैश हो जाता है!
फ़ंक्शन पहचानता है जब उसके हाथों पर एक डुप्लिकेट होता है - और यह करता है खुद को फिर से कॉल करता है - लेकिन makeCubes फ़ंक्शन लगता है उस दूसरे निष्पादन की प्रतीक्षा करने में सक्षम नहीं होने के लिए। ऐसा लगता है जैसे यह पहले से ही आगे बढ़ चुका है, और यह tempCube को इसके संभावित कोर्ड्स पर प्रदर्शित करने का प्रयास कर रहा है।

मैंने async और await का उपयोग करके इसे हल करने का प्रयास किया लेकिन यह काम नहीं किया - और मैं वास्तव में Promises पेड़ को भौंकना नहीं चाहता - ऐसा लगता है कि मुझे यहां कुछ याद आ रहा है और यह कि एक सीधा-सीधा समाधान होना चाहिए...?

0
Sirab33 4 फरवरी 2021, 05:35
मूल ऐरे की प्रतिलिपि बनाने के लिए क्लीनर हो सकता है और हर बार उस प्रतिलिपि से प्रत्येक आइटम को विभाजित कर सकता है।
 – 
Kaiido
4 फरवरी 2021, 06:21

1 उत्तर

सबसे बढ़िया उत्तर

यह आंशिक रूप से एक अनुमान है, लेकिन आप उस मान को वापस नहीं करते हैं जो selectRandomXYCoordinateObject() पर रिकर्सिव कॉल लौटाता है:

       // Check if this Coord-number was already selected:
       if(selectedCoordIDNumbersArray.includes(randomCoordNumber)) {
           // A Coord of this ID was already selected!
           console.log(“Duplicate!”);
           // Immediately call this function again:
           selectRandomXYCoordinateObject();
       }

के बजाए:

       // Check if this Coord-number was already selected:
       if(selectedCoordIDNumbersArray.includes(randomCoordNumber)) {
           // A Coord of this ID was already selected!
           console.log(“Duplicate!”);
           // Immediately call this function again:
           return selectRandomXYCoordinateObject();
       }

तो selectRandomXYCoordinateObject() को पहली कॉल undefined लौटाती है, और यह मानते हुए कि आप कैली में लौटाई गई वस्तु के गुणों तक पहुंचने का प्रयास कर रहे हैं, आपको एक TypeError मिलेगा और क्रैश हो जाएगा।

संपादित करें: वैसे, किसी सरणी को विशिष्ट रूप से नमूना करने का यह सबसे अच्छा तरीका नहीं है - देखें O(1) में अद्वितीय (गैर-दोहराव) यादृच्छिक संख्याएं?

1
Chayim Friedman 4 फरवरी 2021, 06:58
दिलचस्प - यह अब और दुर्घटनाग्रस्त नहीं हो रहा है - लेकिन यह अभी भी मुझे डुप्लीकेट दे रहा है। बहुत अजीब...
 – 
Sirab33
4 फरवरी 2021, 05:57
नहीं, मैं यही कह रहा हूं: यह अब दुर्घटनाग्रस्त नहीं हो रहा है। यह ठीक चल रहा है - लेकिन, यह अभी भी मुझे डुप्लीकेट दे रहा है।
 – 
Sirab33
4 फरवरी 2021, 06:12
हो सकता है कि कोर्ड्स ऐरे में डुप्लीकेट हों?
 – 
Chayim Friedman
4 फरवरी 2021, 06:13
हाँ, मैं बस उसे देखना शुरू कर रहा था... मैं आपको बता देता हूँ
 – 
Sirab33
4 फरवरी 2021, 06:16
ठीक है - आपको क्या संदेह था - और मुझे क्या संदेह था - वास्तव में सच था: मेरे पास मेरे कोर्ड्स एरे में डुप्लीकेट थे (जिसमें वास्तव में 10,000 समन्वय वस्तुएं हैं, 100 नहीं!) मैंने उन्हें एल्गोरिदमिक रूप से उत्पन्न किया, प्रत्येक चतुर्थांश प्रति 2500, इसलिए हां, मेरे पास डुप्लिकेट थे . और return का उपयोग करने का आपका सुझाव काम करता है! शुक्रिया!
 – 
Sirab33
4 फरवरी 2021, 06:51