Exit
  • Global community
    • Language:
      • Deutsch
      • English
      • Español
      • Français
      • Português
  • 日本語コミュニティ
  • 한국 커뮤니티
0

Issue with 'MyArray.splice'?

New Here ,
Sep 17, 2013 Sep 17, 2013

I have the following code in my ActrionScript 3.0 class:

if(RandTarget == true){

     for(b = 0; b < totalHits; b++){

          tempArray = tempArrayB.slice(0);

          hitsPerTarget[tempArray.splice(Math.floor(Math.random() * tempArray.length), 1)] += 1;

     }

}   

This code is intended to set tempArray equal to tempArrayB, then add 1 to a specific spot on the hitsPerTarget array, which is determined randomly based on which number is spliced out of tempArray.

Using Trace, it appears that two elements are deleted from the hitsPerTarget array during each cycle of the for loop, instead of just one. However, if I change the "+= 1" part to just "= 1", it goes back to just deleting one element like it's supposed to. Why is this, and how can I fix it? I need this loop to add 1 to the chosen spot on the array for each cycle of the loop, and splice out no more than 1 one the elements in the array with each cycle.

TOPICS
ActionScript
654
Translate
Report
Community guidelines
Be kind and respectful, give credit to the original source of content, and search for duplicates before posting. Learn more
community guidelines

correct answers 1 Correct answer

LEGEND , Sep 17, 2013 Sep 17, 2013

There are likely a couple of things at work here that are not obvious.  The first being that when you splice an array it returns an array.  So the following code is not properly devised...

    hitsPerTarget[tempArray.splice(Math.floor(Math.random() * tempArray.length), 1)]

since it is really specifying...

    hitsPerTarget[Array] 

where I think what you really want is just the 0 element within that array.

I think (I'm not certain) the part that does the double removal from the array is the use of th

...
Translate
LEGEND ,
Sep 17, 2013 Sep 17, 2013

There are likely a couple of things at work here that are not obvious.  The first being that when you splice an array it returns an array.  So the following code is not properly devised...

    hitsPerTarget[tempArray.splice(Math.floor(Math.random() * tempArray.length), 1)]

since it is really specifying...

    hitsPerTarget[Array] 

where I think what you really want is just the 0 element within that array.

I think (I'm not certain) the part that does the double removal from the array is the use of the += with some processing hierarchy working behind the scenes.

A += B is the same as saying

A = A + B

So what if it actually performs that math in that manner behind the scenes?  What if A is some set of functions....

A() = A() + B

Now replace that A function with your splicing method code... it ends up splicing the array twice.

What I recommend for avoiding this is to do that splicing before trying to use it in the += line, and remember that you are dealing with a spliced array... as in....

   var temp:Array = tempArray.splice(Math.floor(Math.random() * tempArray.length), 1);

   hitsPerTarget[temp[0]] += 1;

Translate
Report
Community guidelines
Be kind and respectful, give credit to the original source of content, and search for duplicates before posting. Learn more
community guidelines
New Here ,
Sep 17, 2013 Sep 17, 2013
LATEST

I see. Thanks a lot for the detailed help. I managed to solve the problem using your example. Since I was only having the splice return one element, I hadn't considered that the data returned would be an array. I'll remember that now.

Translate
Report
Community guidelines
Be kind and respectful, give credit to the original source of content, and search for duplicates before posting. Learn more
community guidelines