473,387 Members | 3,810 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,387 software developers and data experts.

i need an equivalent to PHP's array_unique function


The PHP scripting language has the array_unique() function that gets
the unique, non-redundant values out of an array.

Does Javascript have anything similar?

Jul 23 '05 #1
7 6477
Jc
lk******@geocities.com wrote:
The PHP scripting language has the array_unique() function that gets
the unique, non-redundant values out of an array.

Does Javascript have anything similar?


The short answer is no, but there's a few ways around it.

If you use an Object as a pretend associative array you can either
iterate once through the array and put each element into the
associative array and get a unique list (but it won't be guaranteed to
be in the same order as the indexed array, using the for..in
statement). You could also just use an "associative array" to start
with, instead of an array.

If you care about order, you could add the data to both an associative
array and the indexed array, and use the associative array to quickly
check if the data already exists before adding it to the arrays.

Jul 23 '05 #2
Jc wrote:
lk******@geocities.com wrote:
The PHP scripting language has the array_unique() function that gets
the unique, non-redundant values out of an array.

Does Javascript have anything similar?

The short answer is no, but there's a few ways around it.

If you use an Object as a pretend associative array you can either
iterate once through the array and put each element into the
associative array and get a unique list (but it won't be guaranteed to
be in the same order as the indexed array, using the for..in
statement). You could also just use an "associative array" to start
with, instead of an array.


The only problem being that JS has no "associative arrays".

--
Randy
comp.lang.javascript FAQ - http://jibbering.com/faq & newsgroup weekly
Jul 23 '05 #3
Jc
Randy Webb wrote:
Jc wrote:
If you use an Object as a pretend associative array you can either
iterate once through the array and put each element into the
associative array and get a unique list (but it won't be guaranteed to
be in the same order as the indexed array, using the for..in
statement). You could also just use an "associative array" to start
with, instead of an array.


The only problem being that JS has no "associative arrays".


I agree that JS does not explicitly implement a data structure called
an "associative array". However, being such an expressive language, JS
objects can definitely be used as a collection of name/value pairs,
which I don't have a problem referring to informally as an associative
array. Not to mention that this is significantly more meaningful to
someone coming from a PHP background.

I thought it was obvious that in my previous post I was referring to a
feature in JS which is commonly referred to as an "associative array"
for simplicity in explanations. Notice how I said "pretend", and notice
I quoted the words "associative arrays", and notice how I said to use a
JS object, which is how JS implements what is known as an associative
array in other languages.

Just to clarify things, when I referred to using a JS object as a
pretend associative array, I was referring to the technique described
on the following site (someone may have a better link):

http://www.unix.org.ua/orelly/web/jscript/ch07_06.html

FYI: An interesting application of JS objects used in this way (in
combination with an initialization syntax/notation) is JSON:

http://www.crockford.com/JSON/index.html

Jul 23 '05 #4
<lk******@geocities.com> wrote in message news:11**********************@g14g2000cwa.googlegr oups.com...

The PHP scripting language has the array_unique() function that gets
the unique, non-redundant values out of an array.

Does Javascript have anything similar?


I think these functions will do what you want.

..arrayUnique() returns a new array containing the unique values,

..trashDuplicates() acts upon the original array, returning it with duplicates removed.
For strict type-comparisons, remove the comments in the 'if' statement.

<SCRIPT type='text/javascript'>

var dups=["1", 1, "four", "3", 2, "2", 1, "four", "2", 2, 3, "3",2];

if( typeof Array().arrayUnique=='undefined' )
Array.prototype.arrayUnique=function()
{
var noDuplicates=[];

for( var i=0, k=0; i<this.length; i++ )
{
for( var j=0; j<noDuplicates.length && this[i]!=noDuplicates[j] ; j++ )
;
if(j==noDuplicates.length)
noDuplicates[k++]=this[i];
}

return noDuplicates;
}
if( typeof Array().trashDuplicates=='undefined' ) // as if...
Array.prototype.trashDuplicates=function()
{
for( var i=0; i<this.length; i++ )
for( var j=0; j<this.length; j++ )
if( i!=j && this[i]==this[j] /** && typeof(this[i])==typeof(this[j]) **/ )
for( var k=j; k<this.length; k++ )
{
this[k]=this[k+1];
this.length--;
} // no .splice() in I.E. 5.0 :(

return this;
}

alert("dups.arrayUnique()==[ "+dups.arrayUnique() +" ]\n\ndups.trashDuplicates()==["
+dups.trashDuplicates()+"] New length is: "+dups.length);

</SCRIPT>

--
Stephen Chalmers http://makeashorterlink.com/?H3E82245A

547265617375726520627572696564206174204F2E532E2072 65663A205451323437393134

Jul 23 '05 #5
fox


lk******@geocities.com wrote:
The PHP scripting language has the array_unique() function that gets
the unique, non-redundant values out of an array.

Does Javascript have anything similar?


works with indexed, associative, and "mixed" arrays:
Array.prototype.unique = function()
{

var mark = [];

for(var i in this)
{

// var indx = this[i]; --> if type does not matter
// create a unique index if type does matter
var indx = this[i] + "_" + typeof(this[i]);

if(mark[indx])
delete this[i];
else
mark[indx] = this[i];
}

this.sort();

// empty indexed entries are at the end of the array
// shorten it [delete does not reduce array]

while(!this[this.length-1]) this.length--;

}
var dups = ["1", 1, "four", "3", "2", 2, 1, "four", "2", 2, 3, "3"];

dups["quick"] = 44;
dups["brown"] = "test";
dups["fox"] = 44;
dups["jumps"] = "test";

dups.unique();

dups is changed -- no need to create a new array to receive a result.

resultant array is sorted (hope that doesn't matter)

result of dups.unique():

slot : value type
0 : 1 --> number
1 : 1 --> string
2 : 2 --> number
3 : 2 --> string
4 : 3 --> number
5 : 3 --> number
6 : four --> string
quick: 44 --> number
brown: test --> string
result if type doesn't matter:

0 : 1
1 : 2
2 : 3
3 : four
quick: 44
brown: test

Jul 23 '05 #6
fox
*** correction follows ***

<snip>


Array.prototype.unique = function()
{

var mark = [];

for(var i in this)
{

// var indx = this[i]; --> if type does not matter
// create a unique index if type does matter
var indx = this[i] + "_" + typeof(this[i]);

if(mark[indx])
delete this[i];
else
mark[indx] = this[i];
}

this.sort();

// empty indexed entries are at the end of the array
// shorten it [delete does not reduce array]

if(this.length) {
while(!this[this.length-1]) this.length--; }
}

[**IE did not start generating errors until it was restarted]
Jul 23 '05 #7
"Jc" <go****@weinrichs.com> wrote in message
news:11**********************@z14g2000cwz.googlegr oups.com...
lk******@geocities.com wrote:
The PHP scripting language has the array_unique() function that gets
the unique, non-redundant values out of an array.

Does Javascript have anything similar?


The short answer is no, but there's a few ways around it.

If you use an Object as a pretend associative array you can either
iterate once through the array and put each element into the
associative array and get a unique list (but it won't be guaranteed to
be in the same order as the indexed array, using the for..in
statement). You could also just use an "associative array" to start
with, instead of an array.

If you care about order, you could add the data to both an associative
array and the indexed array, and use the associative array to quickly
check if the data already exists before adding it to the arrays.


He can implement something that works very similar to PHP's
array_unique() quite easily:

<script type="text/javascript">
// modifies the current Array
function array_unique(arr) {
var existingItems = {};
var prefix = String(Math.random() * 9e9);
var ii = 0;
while (ii < arr.length) {
if (existingItems[prefix + arr[ii]]) {
arr.splice(ii, 1);
} else {
existingItems[prefix + arr[ii]] = true;
++ii;
}
}
}
// returns a copy
function array_unique2(arr) {
var newArray = [];
var existingItems = {};
var prefix = String(Math.random() * 9e9);
for (var ii = 0; ii < arr.length; ++ii) {
if (!existingItems[prefix + arr[ii]]) {
newArray.push(arr[ii]);
existingItems[prefix + arr[ii]] = true;
}
}
return newArray;
}

var a = [ 'one', 'two', 'three', 'two', 'one' ];
alert(array_unique2(a));
array_unique(a);
alert(a);
</script>

--
Grant Wagner <gw*****@agricoreunited.com>
comp.lang.javascript FAQ - http://jibbering.com/faq
Jul 23 '05 #8

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

Similar topics

4
by: MegaZone | last post by:
I'm having some issues with PHP DOMXML - in particular the get_elements_by_tagname method. Now, the PGP docs on this are, well, sparse, so maybe I'm just doing something stupid. I thought this...
3
by: Phil Powell | last post by:
<?php class SuperClass { var $mySuperClassVar; function SuperClass($myVar) { $this->mySuperClassVar = $myVar; echo "super class var = $myVar<p>"; }
7
by: am_ggh | last post by:
Is there a PHP equivalent of TCL's "upvar" ? I will appreciate any insights. Andy
2
by: Adam Kubica | last post by:
Hellou. Anybody know about code that work equivalent to gzinflate() function used in PHP? I search via google but I don't found anything sensible :-(
18
by: Csaba Gabor | last post by:
Is there a straightforward way of implementing a PHP equivalent to window.setTimeout? In a javascript web app, it's often the case that things are done on an event driven basis. For example,...
5
by: GuangXiN | last post by:
I need an stmp client to send email through my mail server. I don't want to use php's mail function. who can recommend some?
2
by: freddukes | last post by:
Okay... I'm a PHP noob but I have a good background in C++ and Python... Now all I want to do is iterate through the following file, and appending all products to an array, with information stored...
1
by: divyac | last post by:
Hi I have a text file named email.txt which has the following contents test@test.com a@x.com zooman@deeply.bored.org b@x.com guess.me@where.ami.net testmore@test.com I want only the domain...
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:
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
by: emmanuelkatto | last post by:
Hi All, I am Emmanuel katto from Uganda. I want to ask what challenges you've faced while migrating a website to cloud. Please let me know. Thanks! Emmanuel
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: nemocccc | last post by:
hello, everyone, I want to develop a software for my android phone for daily needs, any suggestions?
0
by: Hystou | last post by:
There are some requirements for setting up RAID: 1. The motherboard and BIOS support RAID configuration. 2. The motherboard has 2 or more available SATA protocol SSD/HDD slots (including MSATA, M.2...
0
marktang
by: marktang | last post by:
ONU (Optical Network Unit) is one of the key components for providing high-speed Internet services. Its primary function is to act as an endpoint device located at the user's premises. However,...
0
by: Hystou | last post by:
Most computers default to English, but sometimes we require a different language, especially when relocating. Forgot to request a specific language before your computer shipped? No problem! You can...
0
Oralloy
by: Oralloy | last post by:
Hello folks, I am unable to find appropriate documentation on the type promotion of bit-fields when using the generalised comparison operator "<=>". The problem is that using the GNU compilers,...

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.