Martin Haust wrote/zu Deiner Priorität-Alpha-1-Nachricht von Sternzeit
18.03.2008 15:43:
Quote:
Martin Haust schrieb:
Hallo,
ich habe zwei arrays:
ARR1 = new Array(1,2,3,4,5);
ARR2 = new ARRAY(1,3);
Wie kann ich mit javascript einfach aus ARR1 alle Werte löschen, die in
ARR2 enthalten sind?
Als Ergebnis soll ein Array mit den Elementen (2,4,5) herauskommen. In
PHP kann man dies mit der array_diff()-Funktion machen. Gibt es eine
vergleichbare Funktion in javascript?
Gruß
Martin
hat sich erledigt! Unter folgender URL gibt es eine Lösung: http://kevin.vanzonneveld.net/techbl...ps_array_diff/ |
JFTR:
function array_diff (array) {
//
http://kevin.vanzonneveld.net
// + original by: Kevin van Zonneveld (
http://kevin.vanzonneveld.net)
// + improved by: Sanjoy Roy
// * example 1: array_diff(['Kevin', 'van', 'Zonneveld'], ['van',
// 'Zonneveld']);
// * returns 1: ['Kevin']
var arr_dif = [], i = 1, argc = arguments.length, argv = arguments, key,
key_c, found=false, cntr=0;
// loop through 1st array
for ( key in array ){
// loop over other arrays
for (i = 1; i< argc; i++){
// find in the compare array
found = false;
for (key_c in argv[i]) {
if (argv[i][key_c] == array[key]) {
found = true;
break;
}
}
if(!found){
//arr_dif[key] = array[key];
arr_dif[cntr] = array[key];
cntr++;
}
}
}
return arr_dif;
}
Dieser Algorithmus hat eine Worst-Case-Laufzeitkomplexität von O(n^3), und
beachtet nicht die Reihenfolge der Elemente im Array (diese ist für
for-in-Schleifen nicht definiert).
Zum Vergleich eine effizientere Variante mit einer WCRTC von O(n^2), welche
die Reihenfolge der Elemente beachtet. Sie hat den Nachteil, dass für
nicht-primitive Elemente eine Serialisierung erforderlich ist; dies kann für
native Objekte durch Überschreiben der toString()-Methode des entsprechenden
Prototyp-Objekts erreicht werden.
/**
* Returns an array with all elements removed
* that are elements of other arrays.
*
* @param Array a
* Array to be filtered.
* @params Array
* Arrays to compare against.
* @type
* Array
*/
function array_diff(a, arrays)
{
var dict = new Object();
for (var i = 1, len = arguments.length; i < len; i++)
{
var arg = arguments[i];
for (var j = arg.length; j--

{
dict[arg[j]] = true;
}
}
if (typeof a.filter == "function")
{
return a.filter(
function(v, i, a) {
return !dict.hasOwnProperty(v);
});
}
else
{
var _hasOwnProperty = (function() {
if (typeof dict.hasOwnProperty == "function")
{
return function(o, p) {
return o.hasOwnProperty(p);
};
}
else
{
return function(o, p) {
return (typeof o[p] != "undefined"
&& typeof o.constructor.prototype[p] == "undefined");
};
}
})();
var result = new Array();
i = 0;
for (var len = a.length; i < len; i++)
{
var v = a[i];
if (!_hasOwnProperty(dict, v)) result.push(v);
}
return result;
}
}
PointedEars
--
realism: HTML 4.01 Strict
evangelism: XHTML 1.0 Strict
madness: XHTML 1.1 as application/xhtml+xml
-- Bjoern Hoehrmann