peterS.: die [[Array]] methoden [indexOf] und [contains]

Beitrag lesen

gruss IneX,

Ich habe eine Funktion geschrieben, die das Ziel hat,
ein bestehendes Array nach einem übergebenen Wert zu
druchsuchen. Es sind alles Integer, also Zahlen.

Das Problem ist aber, dass das Script eine Endlosschleife
generiert ...
...
Sobald das Script auf einen passenden Wert trifft,
stürzt es ab. (Zur Info: wenn ein Wert im Array
enthalten ist, ist es schlecht. Deshalb die Prüfung
ob ein Wert NICHT im Array existiert. Stichwort "Blacklist")

... Hier der Code:

function search_array(from_array,search_int)

{
var arr = from_array;
var obj = search_int;

~~~javascript
  /*  
    [from_array] und [search_int] liegen bereits im  
    *wirkungsbereich* Deiner funktion und muessen  
    daher nicht nochmal referenziert werden.  
  */

if (obj != ""){
[code lang=javascript]  /*
    auf [""], [0] und [false] immer strikt (!== bzw. ===)
    pruefen, denn es gilt:
    (("" == 0) === ("" == false) === (0 == false)) === true
  */


>  ~~~javascript

for (i = 0; i < arr.length; i++){  

>    if (arr[i] != obj){ // siehe oben und [*1]  
>     return 1;  
>    } else {  
>     return -1;  
>    }  
>   }  
>  }  
> }

[*1] Dein code erzwingt ueber "return" bei (i === 0)
den sofortigen ausstieg aus der schleife ...

... persoenlich halte ich das fuer schlechten stil und
plaediere hiermit fuer den einsatz des stiefmuetterlich
behandelten "break".

unter beruecksichtigung moeglicher zukuenftiger array-
methoden koenntest Du Deine methode auch [indexOf] nennen.
und damit diese nicht allein im globalen namensraum
abhaengen muss, darfst Du diese ruhig sowohl *statisch*
als auch *prototypisch* an den [[Array]]-konstruktor tackern.

siehe dazu auch:

[http://developer.mozilla.org/en/docs/Core_JavaScript_1.5_Reference:Objects:Array:indexOf]

hier ein moeglicher statischer entwurf ...

// [[link:http://www.pseliger.de/jsExtendedApi/jsApi.Array.mozGenerics.dev.js]]  
//if (typeof Array.indexOf != "function") {  
  
  Array.indexOf = (function (obj, objLookingFor, idx) {  
  
  //var k, i = -1, l = ((typeof obj.length == "number") ? (obj.length) : (0));  
    var k, i = -1, l = (((obj instanceof Array) || ((typeof obj.length == "number") && ((typeof obj.item == "function") || (typeof obj.item == "object") || (typeof obj.item == "string") || (obj instanceof window.NodeList) || (obj instanceof window.HTMLCollection)))) ? (obj.length) : (0));  
  
  //[[link:http://developer.mozilla.org/en/docs/Core_JavaScript_1.5_Reference:Objects:Array:indexOf#Parameters]]  
    idx = ((idx && isNaN(Number(idx))) ? (parseInt(Number(idx), 10)) : (0));  
    idx = ((idx < 0) ? (Math.max(0,(l + idx))) : (idx));  
  
    for (k=idx; k<l; ++k) {  
    //if (obj[k] === objLookingFor) {  
      if ((obj[k] || obj.item(k)) === objLookingFor) {  
        i = k;  
        break;  
      }  
    }  
    return i;  
  });  
//}

... und hier das prototypische gegenstück ...

// [[link:http://www.pseliger.de/jsExtendedApi/jsApi.Array.mozExtensions.dev.js]]  
if (typeof Array.prototype.indexOf != "function") {  
  
  Array.prototype.indexOf = (function (obj, idx) {  
  
  //[http://developer.mozilla.org/en/docs/Core_JavaScript_1.5_Reference:Objects:Array:indexOf#Parameters]  
    idx = ((idx && isNaN(Number(idx))) ? (parseInt(Number(idx), 10)) : (0));  
    idx = ((idx < 0) ? (Math.max(0,(this.length + idx))) : (idx));  
    var k, i = -1;  
    for (k=idx; k<this.length; ++k) {  
      if (this[k] === obj) {  
        i = k;  
        break;  
      }  
    }  
    return i;  
  });  
}

... darauf liessen sich dann auch noch die passenden eigenen [contains]-methoden pfropfen:

// [http://www.pseliger.de/jsExtendedApi/jsApi.Array.mozGenerics.dev.js]  
//if (typeof Array.contains != "function") {  
  
  Array.contains = (function (obj, objLookingFor) {  
  
    return (Array.indexOf(obj, objLookingFor) >= 0);  
  });  
//}
// [http://www.pseliger.de/jsExtendedApi/jsApi.Array.mozExtensions.dev.js]  
if (typeof Array.prototype.contains != "function") {  
  
  Array.prototype.contains = (function (obj) {  
  
    return (this.indexOf(obj) >= 0);  
  });  
}

so long - peterS. - pseliger@gmx.net

--
»Because objects in JavaScript are so flexible, you will want to think differently about class hierarchies.
Deep hierarchies are inappropriate. Shallow hierarchies are efficient and expressive.« - Douglas Crockford
ie:( fl:) br:> va:( ls:& fo:) rl:| n3;} n4:} ss:} de:µ js:} mo:? zu:]