Simple Q: Re-ordering array by specifying first-entry

T

Tuxedo

I have an array in a particular order in a frame (mainframe) which I'd like
to reorder from an onload call of another frame, while from that frame, the
only thing I'd like to specify is which one named array item should be the
first.

In other words, if this is the original array:

var myArray = new Array('a1,'a2','a3','a4','a5')

I'd like to reorder it via a function by only specifying which one item I'd
like to have first. The function, in the same frame as the array, could be
named something lfor example:

function reorder_the_array(i){
swapping or reorder code goes here
}

So if from the other frame I call reorder_the_array() and pass the one item
I'd like to have first, for example, 'a3':
<body onload="top.mainframe.reorder_the_array('a3')";

What's a good way to change the array or make a copy of it and create a new
one without specifying all the array items from where the function is
called?

As mentioned, all I would like to specify in the call from the second frame
is which one item I would like to have first. So for example, by running
reorder_the_array('a3'), the reordered or new array would then become:

a3,a2,a1,a4,a5

If as above, that would simply be swapping positions of a1 and a3.
However, I may sometimes pass 'a1' as the item to be the first in which
case there doesn't need to be any chance. But this can easily be done by
preventing the swapping code from running by a simple if condition.

In fact, it doesn't make any difference which exact order the items are
juggled in the remaining part of the array, as long as:
1) The item passed through the function is placed first
2) The remaining array entries are all unique, so all original array items
exist and that it is the same length as the original.

I guess this is a pretty simple task, and there are probably many ways to
do it. However, I'm note very well-versed on this subject so any pointers
would be mostly appreciated.

Many thanks!
 
R

RobG

I have an array in a particular order in a frame (mainframe) which I'd like
to reorder from an onload call of another frame, while from that frame, the
only thing I'd like to specify is which one named array item should be the
first.

In other words, if this is the original array:

var myArray = new Array('a1,'a2','a3','a4','a5')

I'd like to reorder it via a function by only specifying which one item I'd
like to have first.

How about:

Array.prototype.makeFirst = function(idx) {
this.unshift(this.splice(idx, 1));
return this;
}

alert( ['a1','a2','a3','a4','a5'].makeFirst(2) );

shows: 'a3','a1,'a2','a4','a5'


You may want to check that idx is < arr.length and deal with that,
otherwise you will get an empty array as the first element. Also
check idx isn't < 0, you may want to return undefined, do nothing,
throw an exception, whatever.

Pretty sure you need to modify Array.prototype in the called frame, I
don't use frames, please test that.

The function, in the same frame as the array, could be
named something lfor example:

function reorder_the_array(i){
swapping or reorder code goes here
}

If you want it as a function:

function makeFirst(arr, idx) {
arr.unshift(arr.splice(idx, 1));
return arr;
}

or perhaps:

function makeFirst(arr, idx) {
return [].concat(arr.splice(idx, 1), arr);
}


In this case you need to pass it the array too unless you hard-code
some global variable that references the array (and that global
variable is in the right frame). Again you need to deal with idx >=
length or < 0.

So if from the other frame I call reorder_the_array() and pass the one item
I'd like to have first, for example, 'a3':
<body onload="top.mainframe.reorder_the_array('a3')";

What's a good way to change the array or make a copy of it and create a new
one without specifying all the array items from where the function is
called?

If you want to keep the original array unmodified, you need to copy it
first.

As mentioned, all I would like to specify in the call from the second frame
is which one item I would like to have first. So for example, by running
reorder_the_array('a3'), the reordered or new array would then become:

a3,a2,a1,a4,a5

If as above, that would simply be swapping positions of a1 and a3.  
However, I may sometimes pass 'a1' as the item to be the first in which
case there doesn't need to be any chance. But this can easily be done by
preventing the swapping code from running by a simple if condition.

In fact, it doesn't make any difference which exact order the items are
juggled in the remaining part of the array, as long as:
1) The item passed through the function is placed first
2) The remaining array entries are all unique, so all original array items
exist and that it is the same length as the original.

The unique constraint wasn't there before, I guess you mean you want
the nominated element to be moved, not copied.
 
T

Tuxedo

RobG said:
[...]

The unique constraint wasn't there before, I guess you mean you want
the nominated element to be moved, not copied.

Yes exactly. I think I could have described it much better like that.

I guess it could also be done by pattern-matching:
1) identifying the position of the item that needs to be moved.
2) deleting that array entry.
3) insterting it as the first item of the array.

Step #1 would require searching for the position of a string match in an
array and returning its position for later deleting it. How can this be
done?

In any case, many thanks for the various examples, will test them today.

Tuxedo
 
D

Dr J R Stockton

In comp.lang.javascript message <[email protected]>,
I have an array in a particular order in a frame (mainframe) which I'd like
to reorder from an onload call of another frame, while from that frame, the
only thing I'd like to specify is which one named array item should be the
first.

Consider

A = [6,7,8,9]
function X(x) { for (var J in A) if (A[J]==x) { A[J]=A[0] ; A[0]=x } }
X(8)

There is no need to avoid swapping the zeroth item, but it can be done :
function X(x) { J=A.length
while (--J) if (A[J]==x) { A[J]=A[0] ; A[0]=x } }

To preserve order, seek the element to be moved, use .splice(J,1) to
remove it, and join it to the front.

It's a good idea to read the newsgroup c.l.j and its FAQ. See below.
 
T

Tuxedo

Dr said:
In comp.lang.javascript message <[email protected]>,
I have an array in a particular order in a frame (mainframe) which I'd
like to reorder from an onload call of another frame, while from that
frame, the only thing I'd like to specify is which one named array item
should be the first.

Consider

A = [6,7,8,9]
function X(x) { for (var J in A) if (A[J]==x) { A[J]=A[0] ; A[0]=x } }
X(8)

There is no need to avoid swapping the zeroth item, but it can be done :
function X(x) { J=A.length
while (--J) if (A[J]==x) { A[J]=A[0] ; A[0]=x } }

To preserve order, seek the element to be moved, use .splice(J,1) to
remove it, and join it to the front.

It's a good idea to read the newsgroup c.l.j and its FAQ. See below.

Thanks for posting this and the previous example by RG. I tested them and
found they all work, and will keep all in an advanced JS folder as good
examples for future use. I realised, however, by spending a couple of hours
tinkering with it, that what needs to be done is actually much simpler and
something different altogether. So after thinking about what exactly I
need, for about 3 minutes, it only took about 10 minutes to write it
together. Totally and utterly simple stuff I wouldn't want to post here :)
 

Ask a Question

Want to reply to this thread or ask your own question?

You'll need to choose a username for the site, which only take a couple of moments. After that, you can post your question and our members will help you out.

Ask a Question

Members online

No members online now.

Forum statistics

Threads
473,756
Messages
2,569,535
Members
45,008
Latest member
obedient dusk

Latest Threads

Top