473,382 Members | 1,336 Online
Bytes | Software Development & Data Engineering Community
Post Job

Home Posts Topics Members FAQ

Join Bytes to post your question to a community of 473,382 software developers and data experts.

removing array item

I have the following. There must be something less cumbersome without push
pop. The function parameter obj is the event.srcElement and has the
attributes(properties?) picNum and alb pinned to it. The function is part of
a process to delete the selected obj, a photo in this case from the album
vis albumArr. TIA
Jimbo
function Album(albumName) {
this.name=albumName;
this.paths=new Array();
}
var albumArr(); // holds an array of Albums();
function removeArrSrc(obj) {
var dummy=new Array();
for(i=0;i<albumArr.length;i++) {
dummy[i]=new Album(albumArr[i].name);
var el=albumArr[i].paths;
for(var j=0;j<el.length;j++) {
if(dummy[i].name==obj.alb) {
if(j==obj.picNum) continue;
}
var len=dummy[i].paths.length;
dummy[i].paths[len]=el[j];
}
}
albumArr=dummy;
}

Jul 23 '05 #1
13 2307
On Mon, 30 Aug 2004 11:47:41 +0200, J. J. Cale <ph****@netvision.net.il>
wrote:

01234567890123456789012345678901234567890123456789 01234567890123456789
I have the following. There must be something less cumbersome without
push pop. The function parameter obj is the event.srcElement
Is this for the Web, or just an IE-only environment?
and has the attributes(properties?) picNum and alb pinned to it. The
function is part of a process to delete the selected obj, a photo in
this case from the album vis albumArr. TIA function Album(albumName) {
this.name=albumName;
this.paths=new Array();
}
var albumArr(); // holds an array of Albums();
I don't know what that's supposed to be, but I'm certain it'll cause an
error on most browsers. Perhaps you meant:

var albumArr = [];
function removeArrSrc(obj) {
var dummy=new Array();
for(i=0;i<albumArr.length;i++) {
dummy[i]=new Album(albumArr[i].name);
var el=albumArr[i].paths;
for(var j=0;j<el.length;j++) {
if(dummy[i].name==obj.alb) {
if(j==obj.picNum) continue;
}
var len=dummy[i].paths.length;
dummy[i].paths[len]=el[j];
}
}
albumArr=dummy;
}


How about:

function removeArrSrc(o) {
var i = 0, n = albumArr.length;

// Find the element, 'o'
while(i < n && albumArr[i] != o) {++i;}
// If 'o' exists in the array, 'i' will now point it
if(i < n) {
// Don't want to reach the last element
--n;
// Now shift the remaining elements down
while(i < n) {albumArr[i] = albumArr[i + 1]; ++i;}
// Finally, truncate the array
albumArr.length = n;
}
}

which is removes the element in-place. You could also use:

function removeArrSrc(o) {
var i = 0, n = albumArr.length;

// Find the element, 'o'
while(i < n && albumArr[i] != o) {++i;}
// If 'o' exists in the array, 'i' will now point it
if(i < n) {
albumArr = albumArr.slice(0, i).concat(albumArr.slice(i + 1));
}
}

which might be a little quicker (due to being performed by the browser),
but probably isn't (due to the resulting array allocations).

I haven't tested these, by the way.

Good luck,
Mike

--
Michael Winter
Replace ".invalid" with ".uk" to reply by e-mail.
Jul 23 '05 #2

"Michael Winter" <M.******@blueyonder.co.invalid> wrote in message
news:opsdjinqrxx13kvk@atlantis...
On Mon, 30 Aug 2004 11:47:41 +0200, J. J. Cale <ph****@netvision.net.il>
wrote:

01234567890123456789012345678901234567890123456789 01234567890123456789
I have the following. There must be something less cumbersome without
push pop. The function parameter obj is the event.srcElement
Is this for the Web, or just an IE-only environment?


Ideally it would be generic although currently I'm writing an HTA.
and has the attributes(properties?) picNum and alb pinned to it. The
function is part of a process to delete the selected obj, a photo in
this case from the album vis albumArr. TIA

function Album(albumName) {
this.name=albumName;
this.paths=new Array();
paths array holds image paths
}
var albumArr(); // holds an array of Albums();


I don't know what that's supposed to be, but I'm certain it'll cause an
error on most browsers. Perhaps you meant:

var albumArr = [];

Sorry! It is declared var albumArr=new Array();
function removeArrSrc(obj) {
var dummy=new Array();
for(i=0;i<albumArr.length;i++) {
dummy[i]=new Album(albumArr[i].name);
var el=albumArr[i].paths;
for(var j=0;j<el.length;j++) {
if(dummy[i].name==obj.alb) {
if(j==obj.picNum) continue;
}
var len=dummy[i].paths.length;
dummy[i].paths[len]=el[j];
}
}
albumArr=dummy;
}


How about:

function removeArrSrc(o) {
var i = 0, n = albumArr.length;

// Find the element, 'o'
while(i < n && albumArr[i] != o) {++i;}

the array albumArr contains an array of Album objects. I need to delete
the path for one image.
the reference obj (here 'o') has the album name and the index in the
paths array pinned as attributes
I'm searching therefore for o.alb (the album name) and o.picNum the
offset into the paths array of the Album object.
while(i<n && albumArr[i].name != o.alb) {++i} should work to
find the album
// If 'o' exists in the array, 'i' will now point it
if(i < n) {
// Don't want to reach the last element
--n;
// Now shift the remaining elements down
while(i < n) {albumArr[i] = albumArr[i + 1]; ++i;}
// Finally, truncate the array
albumArr.length = n;
}
}
This would delete the entire album. I need to delete the image from the
paths array of the album. The slice method with a regex is what I'm looking
for but I'm just getting into regex.
which is removes the element in-place. You could also use:

function removeArrSrc(o) {
var i = 0, n = albumArr.length;

// Find the element, 'o'
while(i < n && albumArr[i] != o) {++i;}
// If 'o' exists in the array, 'i' will now point it
if(i < n) {
albumArr = albumArr.slice(0, i).concat(albumArr.slice(i + 1));
}
}

which might be a little quicker (due to being performed by the browser),
but probably isn't (due to the resulting array allocations).
I hope I've explained myself better this time. Thanks for the above particularly because I haven't written the funtion to delete an album yet.
I'm sure this will do the job.
Jimbo I haven't tested these, by the way.

Good luck,
Mike

--
Michael Winter
Replace ".invalid" with ".uk" to reply by e-mail.

Jul 23 '05 #3
On Tue, 31 Aug 2004 09:02:32 +0200, J. J. Cale <ph****@netvision.net.il>
wrote:
"Michael Winter" <M.******@blueyonder.co.invalid> wrote in message
news:opsdjinqrxx13kvk@atlantis...
On Mon, 30 Aug 2004 11:47:41 +0200, J. J. Cale
<ph****@netvision.net.il> wrote:
[snip]
event.srcElement
Is this for the Web, or just an IE-only environment?


Ideally it would be generic although currently I'm writing an HTA.


The reason I asked is that event.srcElement is IE-only. You'll also have
to check event.target, and possibly other properties, for the code to work
with other browsers. However, since you're writing a HTA, it isn't of much
concern at the moment.

[snip]
the array albumArr contains an array of Album objects. I need to
delete the path for one image.
Sorry.
the reference obj (here 'o') has the album name and the index in the
paths array pinned as attributes
I'm searching therefore for o.alb (the album name) and o.picNum the
offset into the paths array of the Album object.
while(i<n && albumArr[i].name != o.alb) {++i} should work
to find the album
Yes, it would.

[snip]
This would delete the entire album. I need to delete the image from the
paths array of the album. The slice method with a regex is what I'm
looking for but I'm just getting into regex.


I don't think that a regular expression would be terribly useful. Of
course, I'm not seeing the whole picture, so I could be wrong.

[snip]

function Album(albumName) {
this.name = albumName;
this.paths = [];
}
Album.prototype.removePath = function(i) {
for(var n = this.paths - 1; i < n; ++i) {
this.paths[i] = this.paths[i + 1];
}
this.paths.length = n;
};

function removeArrSrc(o) {
for(var i = 0, n = albumArr.length; i < n; ++i) {
if(albumArr[i].name == o.alb) {
albumArr[i].removePath(o.picNum);
break;
}
}
}

I forsee a possible problem here. Say that you delete the first path
(picNum 0). In the paths array, all of the elements will shift making the
second path first, third path second, etc. If you then delete the second
path (picNum 1), you'll actually be deleting the third path from the
original list. Do you account for that?

Mike

--
Michael Winter
Replace ".invalid" with ".uk" to reply by e-mail.
Jul 23 '05 #4
J. J. Cale wrote:
I have the following. There must be something less cumbersome without push
pop. The function parameter obj is the event.srcElement
which is IE only, use

function foo(e)
{
if (!e)
e = event;

if (e)
{
var t = e.target ? e.target : e.srcElement;
if (t)
{
// do something with t
}
}
}

<... on...="foo(event);" ...>...</...>

instead.
and has the attributes(properties?) picNum and alb pinned to it. The
function is part of a process to delete the selected obj, a photo in
this case from the album vis albumArr. TIA
Jimbo
function Album(albumName) {
this.name=albumName;
this.paths=new Array();
}
var albumArr(); // holds an array of Albums();
Invalid syntax. () is the call operator and can only be applied to
functions/methods.

var albumArr;

Watch the JavaScript Console or the status bar of the browser window!
function removeArrSrc(obj) {
var dummy=new Array();
for(i=0;i<albumArr.length;i++) {
Note that `i' is declared global here, causing mostly undesired
side effects. Use the `var' keyword (and optimize a bit):

for (var i = 0, len = albumArr.length; i < len; i++)
{
// ...
}

Since order does not seem to matter here, this can be
further optimized:

for (var i = albumArr.length; i--; 0)
{
// ...
}

This loops from the last element to the first.
dummy[i]=new Album(albumArr[i].name);
[...]


To remove an array element, use the "delete" operator:

delete albumAr[42];

The array size will not be reduced, but further references
to albumAr[42] will return `undefined' instead of an Album
object reference which you can detect in your loop:

for (var i = albumAr.length; i--; 0)
{
if (albumAr[i])
{
delete albumAr[i];
}
}

More sophisticated but requires JavaScript 1.1 and compatibles:

for (var i = albumAr.length; i--; 0)
{
if (typeof albumAr[i] != "undefined")
{
delete albumAr[i];
}
}

or

for (var i = albumAr.length; i--; 0)
{
if (albumAr[i] && albumAr[i].constructor == Album)
{
delete albumAr[i];
}
}

Even more sophisticated but requires an ECMAScript 3 or later
implementation (e.g. JavaScript 1.5, JScript 5.6):

for (var i = albumAr.length; i--; 0)
{
if (albumAr[i] instanceof Album)
{
delete albumAr[i];
}
}

You may want to add further conditions which must be matched
before the element will be deleted: your search parameters.
HTH

PointedEars

P.S.
Falsifying header information is not appropriate behavior (violating
several Usenet/Internet standards, the Netiquette and most certainly
the Acceptable Use Policy of service providers). It only *supports*
spammers' doing: <http://www.interhack.net/pubs/munging-harmful/>
--
If they outlaw encryption, only outlaws will
62Xq3mrg45x69A96yvxi70gXrSdD+SCw
Jul 23 '05 #5
Thomas 'PointedEars' Lahn <Po*********@web.de> writes:

A few nitpicks:
function foo(e)
{
if (!e)
e = event;
these two lines are not necessary if you do:
<... on...="foo(event);" ...>...</...>
The event will be the argument to the function in all browsers (since
you pass it explicitly, and they all agree that "event" refers to the
event in an intrinsic event handler). It is needed (in IE) only when
you assign the function directly, as in:
something.onwhatever = foo;
Even more sophisticated but requires an ECMAScript 3 or later
implementation (e.g. JavaScript 1.5, JScript 5.6):

for (var i = albumAr.length; i--; 0)


This would start "i" out at albumAr.length, which is one past
the last element of the array. It should probably be
...(var i = albumAr.length - 1; ...

The "0" can also be omitted (all three expressions in a "for"
construct are optional).
--
Lasse Reichstein Nielsen - lr*@hotpop.com
DHTML Death Colors: <URL:http://www.infimum.dk/HTML/rasterTriangleDOM.html>
'Faith without judgement merely degrades the spirit divine.'
Jul 23 '05 #6
Lasse Reichstein Nielsen wrote:
Thomas 'PointedEars' Lahn <Po*********@web.de> writes:
function foo(e)
{
if (!e)
e = event;
these two lines are not necessary if you do:
<... on...="foo(event);" ...>...</...>


[...] It is needed (in IE) only when
you assign the function directly, as in:
something.onwhatever = foo;


Correct, I confused both.
Even more sophisticated but requires an ECMAScript 3 or later
implementation (e.g. JavaScript 1.5, JScript 5.6):

for (var i = albumAr.length; i--; 0)


This would start "i" out at albumAr.length, which is one past
the last element of the array. It should probably be
...(var i = albumAr.length - 1; ...


No, it should not. The value of i is decreased the first time
the loop is executed.
The "0" can also be omitted (all three expressions in a "for"
construct are optional).


It cannot be omitted, the expressions are not optional in all
implementations.
PointedEars
--
Talk to the hand, the hand doesn't listen...
Jul 23 '05 #7
Lasse Reichstein Nielsen wrote:
Thomas 'PointedEars' Lahn writes:
for (var i = albumAr.length; i--; 0)


This would start "i" out at albumAr.length, which is one past
the last element of the array. It should probably be
...(var i = albumAr.length - 1; ...

<snip>

No, the first two expressions are fine. The - i-- - post decrements the
counter before its first use (assuming length was not zero, else there
would be no array access) leaving it the equivalent of length-1 when it
is first used.

Rihcard.

Jul 23 '05 #8
Thomas 'PointedEars' Lahn <Po*********@web.de> writes:
No, it should not. The value of i is decreased the first time
the loop is executed.
Ach, yes. The decrement is in the test, which is (apparently)
confuzing enough that I won't recommend it (for anything I have
to read :)
It cannot be omitted, the expressions are not optional in all
implementations.


Can you name one where it isn't?

All three expressions are optional in Javascript 1.0 (tested in
Netscape 2.02) and in ECMAScript v1.

/L
--
Lasse Reichstein Nielsen - lr*@hotpop.com
DHTML Death Colors: <URL:http://www.infimum.dk/HTML/rasterTriangleDOM.html>
'Faith without judgement merely degrades the spirit divine.'
Jul 23 '05 #9
Thomas 'PointedEars' Lahn wrote:
Lasse Reichstein Nielsen wrote:
<--snip-->
The "0" can also be omitted (all three expressions in a "for"
construct are optional).

It cannot be omitted, the expressions are not optional in all
implementations.


Can you quote one that does not allow them to be optional?
--
Randy
comp.lang.javascript FAQ - http://jibbering.com/faq
Jul 23 '05 #10
Lasse Reichstein Nielsen wrote:
Thomas 'PointedEars' Lahn <Po*********@web.de> writes:
It cannot be omitted, the expressions are not optional in all
implementations.
Can you name one where it isn't?


Micro$oft JScript, according to the MSDN Library, which IIRC matches
reality in IE 6 SP-1 on Win2k SP-4.
All three expressions are optional in Javascript 1.0 (tested in
Netscape 2.02) and in ECMAScript v1.


Yes, but non sequitur.
PointedEars
--
Bugzilla: It's not just for people with `e's in their names, anymore!
Jul 23 '05 #11
J. J. Cale wrote:
"Michael Winter" <M.******@blueyonder.co.invalid> wrote in message
news:opsdjinqrxx13kvk@atlantis...


Please do not write attribution novels and trim your quotes.
<http://netmeister.org/news/learn2quote.html>
I don't know what that's supposed to be, but I'm certain it'll cause an
error on most browsers. Perhaps you meant:

var albumArr = [];

Sorry! It is declared var albumArr=new Array();


Both statements are equivalent, while the former (array literal) requires
AFAIK JavaScript 1.3 (supported from Netscape Navigator 4.0 on) and
compatibles, and later. If standards compliant, the implementation must
be standards compliant to ECMAScript 3.
Your Reply-To header still does not comply with Internet/Usenet standards.
no********@noway012.net.il. is not an e-mail address!
PointedEars
--
squared over see squared
Jul 23 '05 #12
Thomas 'PointedEars' Lahn <Po*********@web.de> writes:
Micro$oft JScript, according to the MSDN Library, which IIRC matches
reality in IE 6 SP-1 on Win2k SP-4.


I don't have SP-1, but in IE 6 SP-2 (version
"6.0.2900.2180.xpsp_sp2_rtm.040803-2158") on WinXP, this script alerts
"10" as it should:
---
var x = 4;
var y = 0;
for(;;){y+=x--;if (!x) {break;}}
alert(y);
---
It seems to work as far back as IE 4 (I can't get IE 3 to run scripts)

The MSDN library is not a complete reference. There are features that
are not listed, and listed features that have unlisted exceptions.

I would be very surprised if there are any Javascript/ECMAScript/JScript-
implementations that doesn't allow you to omit all three expressions
of a "for", as that has been the expected behavior of the "for" construct
in all languages using a "C"-language-like "for" construct.

/L
--
Lasse Reichstein Nielsen - lr*@hotpop.com
DHTML Death Colors: <URL:http://www.infimum.dk/HTML/rasterTriangleDOM.html>
'Faith without judgement merely degrades the spirit divine.'
Jul 23 '05 #13
Lasse Reichstein Nielsen wrote:
Thomas 'PointedEars' Lahn <Po*********@web.de> writes:
Micro$oft JScript, according to the MSDN Library, which IIRC matches
reality in IE 6 SP-1 on Win2k SP-4.
I don't have SP-1, but in IE 6 SP-2 (version
"6.0.2900.2180.xpsp_sp2_rtm.040803-2158") on WinXP, this script alerts
"10" as it should:
---
var x = 4;
var y = 0;
for(;;){y+=x--;if (!x) {break;}}
alert(y);
---
It seems to work as far back as IE 4 (I can't get IE 3 to run scripts)


Apparently, my mistake was to omit the trailing ";" in

for (var x = a.length; x--;)

Reincluding it, my example code also works in my IE (see above),
and yours works, of course.
The MSDN library is not a complete reference. There are features that
are not listed, and listed features that have unlisted exceptions.
Unfortunately, yes.
I would be very surprised if there are any Javascript/ECMAScript/JScript-
implementations that doesn't allow you to omit all three expressions
of a "for", as that has been the expected behavior of the "for" construct
in all languages using a "C"-language-like "for" construct.


Me too. According to the Client-side JavaScript 1.3 Reference,
they were already optional in JavaScript 1.0 (1995) and in the
first edition of ECMAScript (1997).
PointedEars
--
Minds are like parachutes, they only work when open.
Jul 23 '05 #14

This thread has been closed and replies have been disabled. Please start a new discussion.

Similar topics

0
by: sameer mowade via .NET 247 | last post by:
Hello All, I have problem while dynamically removing row from the Datagrid which i have added dynamically as shown in the following code snippet. The problem is that while removing dynamically...
66
by: Cor | last post by:
Hi, I start a new thread about a discussion from yesterday (or for some of us this morning). It was a not so nice discussion about dynamically removing controls from a panel or what ever. It...
7
by: Adam Honek | last post by:
Is there a direct way to remove one entry from a one dimensional array? I keep looking but either my eyes are funny or it isn't there. Must we really create a temp array and copy all but 1 of...
6
by: Niyazi | last post by:
Hi all, What is fastest way removing duplicated value from string array using vb.net? Here is what currently I am doing but the the array contains over 16000 items. And it just do it in 10 or...
9
by: Rob Meade | last post by:
Hi all, I have an array of lets say 10 items, I now want to remove an item, lets say from somewhere in the middle, based on one of the element values equalling a value I specify - is there a...
9
by: Rob Meade | last post by:
Hi all, Ok - so I've got the array thing going on, and the session thing going on, and up until now its all been ok. I've got my view basket page which is displaying 3 rows (as an example) - I...
5
by: Phill W. | last post by:
(VB'2003) What's the correct way to remove multiple, selected items from a ListView control (say, from a ContextMenu)? I ask because I'm getting a very annoying ArgumentOutOfRangeException...
0
by: Mike | last post by:
Hi, I have a collection object bound to a data grid, after I remove an item from the collection, the minute I click on the datagrid I get an error saying the specified argument was out of the...
7
by: =?Utf-8?B?Sm9lbCBNZXJr?= | last post by:
I have created a custom class with both value type members and reference type members. I then have another custom class which inherits from a generic list of my first class. This custom listneeds...
1
by: CloudSolutions | last post by:
Introduction: For many beginners and individual users, requiring a credit card and email registration may pose a barrier when starting to use cloud servers. However, some cloud server providers now...
0
by: ryjfgjl | last post by:
In our work, we often need to import Excel data into databases (such as MySQL, SQL Server, Oracle) for data analysis and processing. Usually, we use database tools like Navicat or the Excel import...
0
by: taylorcarr | last post by:
A Canon printer is a smart device known for being advanced, efficient, and reliable. It is designed for home, office, and hybrid workspace use and can also be used for a variety of purposes. However,...
0
by: Charles Arthur | last post by:
How do i turn on java script on a villaon, callus and itel keypad mobile phone
0
by: aa123db | last post by:
Variable and constants Use var or let for variables and const fror constants. Var foo ='bar'; Let foo ='bar';const baz ='bar'; Functions function $name$ ($parameters$) { } ...
0
by: ryjfgjl | last post by:
If we have dozens or hundreds of excel to import into the database, if we use the excel import function provided by database editors such as navicat, it will be extremely tedious and time-consuming...
0
by: ryjfgjl | last post by:
In our work, we often receive Excel tables with data in the same format. If we want to analyze these data, it can be difficult to analyze them because the data is spread across multiple Excel files...
0
BarryA
by: BarryA | last post by:
What are the essential steps and strategies outlined in the Data Structures and Algorithms (DSA) roadmap for aspiring data scientists? How can individuals effectively utilize this roadmap to progress...
1
by: Sonnysonu | last post by:
This is the data of csv file 1 2 3 1 2 3 1 2 3 1 2 3 2 3 2 3 3 the lengths should be different i have to store the data by column-wise with in the specific length. suppose the i have to...

By using Bytes.com and it's services, you agree to our Privacy Policy and Terms of Use.

To disable or enable advertisements and analytics tracking please visit the manage ads & tracking page.