Ronja Räuberstochter: false kollidiert mit 0

Hallo, ich würde gerne NUR DANN eine Variable kreieren, wenn ein gewisser Wert in einem Array vorhanden ist. Funktioniert WUNDERBAR. ...allerdings leider nur solange ich nicht den Index des Werts auslesen will, denn sollte der Wert an erster Stelle (daher Stelle 0) sein, so wird 0 offensichtlich gleich "false" gesetzt:

arr = [2, 4, 6, 12, 43];


var in_arr = arr.reduce(function(acc, curr, index){
	if (curr === 2) { // Problem: Index = 0, d.h. acc = 0, was wiederum "false" ausgibt
		acc = index;
	}
	return acc;
}, false); // solange "false", bis obige Bedingung zutrifft

if (in_arr) {
	console.log("in_arr existiert.");
	console.log(in_arr);
} else {
	console.log("in_arr existiert nicht.");
}
//
// Ausgabe: "in_arr existiert nicht."
// 
// SOLLTE SEIN:
// "in_arr existiert."
// 0

Hierfür irgendwelche Ideen für elegante wie effektive Wordarounds?

Danke für euren Input!

Ronja.

  1. Hi,

    ich würde gerne NUR DANN eine Variable kreieren, wenn ein gewisser Wert in einem Array vorhanden ist. Funktioniert WUNDERBAR. ...allerdings leider nur solange ich nicht den Index des Werts auslesen will, denn sollte der Wert an erster Stelle (daher Stelle 0) sein, so wird 0 offensichtlich gleich "false" gesetzt:

    explizit auf false prüfen, nicht auf "ist sowas wie false".

    if (in_arr) {
    

    ersetzen durch

    if (in_arr === false) {
    

    cu,
    Andreas a/k/a MudGuard

  2. Hallo Ronja,

    abgesehen von Andreas technischem Hinweis auf false vs falsy, ist reduce der falsche Weg um ein Element in einem Array zu suchen.

    Richtig ist Array.prototype.some. Zum einen hört der auf sobald er was gefunden hat (reduce läuft komplett durch) und zum anderen ist die Callbackfunktion viel einfacher.

    arr = [2, 4, 6, 12, 43];
    
    var in_arr = 2;
    if (arr.some(function(v) { return v == in_arr; }))
    	console.log("in_arr existiert.");
    	console.log(in_arr);
    } else {
    	console.log("in_arr existiert nicht.");
    }
    //
    // oder mit Pfeilfunktion, ECMAScript 2015, nicht in Internet Explorer
    if (arr.some(v => v == in_arr))
    	console.log("in_arr existiert.");
    
    

    Rolf

    --
    sumpsi - posui - clusi
    1. Hallo

      abgesehen von Andreas technischem Hinweis auf false vs falsy, ist reduce der falsche Weg um ein Element in einem Array zu suchen.

      Ja.

      Richtig ist Array.prototype.some.

      Das glaube ich nicht. Das wäre der richtige Weg, wenn es darum geht zu testen, ob ein Element in dem Array ein bestimmtes Kriterium erfüllt.

      // Gibt es in dem Array einen Wert größer 3?
      
      const array = [1, 3, 5]
      
      array.some(value => value > 3) // true
      

      Wenn man wie in Ronjas Beispiel testen will, ob in dem Array ein primitiver Wert enthalten ist, oder wenn man eine Objektreferenz hat und testen will, ob das Objekt in der Sammlung enthalten ist, dann wäre Array.prototype.includes() der richtige Weg.

      // Ist der Wert 5 in dem Array enthalten?
      
      const array = [1, 3, 5]
      
      array.includes(5) // true
      

      Wenn es darum geht, ein Element in einem Array zu suchen und dieses zurückzugeben, dann wäre Array.prototype.find() das Mittel der Wahl. Wenn das gesuchte Element in dem Array nicht existiert, dann wird der Wert undefined zurückgegeben.

      // Gib mir das Tupel, dessen erster Wert 3 ist!
      
      const array = [
          [1, 2],
          [3, 4],
          [5, 6]
      ]
      
      array.find(([head]) => head === 3) // [3, 4]
      

      Wenn nicht das Element selbst sondern nur sein Index zurückgegeben werden soll, dann wäre das ein Fall für Array.prototype.findIndex(). Hier wird −1 zurückgegeben, wenn kein Element in dem Array den Test besteht.

      // Gib mir den Index des Objekts mit dem Eigenschaftswert 3!
      
      const array = [
          {key: 1},
          {key: 3},
          {key: 5}
      ]
      
      array.findIndex(({key}) => key === 3) // 1
      

      Wenn man einen Vergleichswert hat, kann mit der Methode Array.prototype.indexOf() oder mit Array.prototype.lastIndexOf() den Index ermittelt werden.

      Was Ronja wirklich erreichen will, ist mir nicht so richtig klar.

      Für mich sieht es so aus, als wollte sie den Index ermitteln. Es soll aber zusätzlich geprüft werden, ob das gesuchte Element überhaupt in dem Array enthalten ist.

      Das wäre vermutlich ein Fall für indexOf() oder findIndex() mit Prüfung des Rückgabewertes auf −1.