2016-10-26 5 views
0

Ich schrieb naiv die folgende Funktion dachte, es würde mir helfen, ein Objekt zu finden, das tief in einer Datenstruktur ist. Aber das funktioniert nicht, weil die Rückkehr innerhalb einer foreach begrenzt wird. Die Funktion wird immer undefiniert zurückgegeben. Wie soll ich das machen?Rückkehr aus einem ForEach

const findStuff = (data, x) => { 
    data.forEach(u => { 
     u.userData.forEach(ud => { 
      const s = ud.stuff.find(s=>s.id === x.id); 
      if (s){ 
       return s; 
      } 
     }); 
    }); 
}; 
+1

Verwenden Sie ein normales 'for' und geben Sie – tymeJV

+0

zurück Verwenden Sie' .find() '?? – vlaz

+0

Richtig, habe nicht bemerkt, dass du es getan hast. So-o-o, tausche einfach deine '.forEaches 'gegen eine' .map' – vlaz

Antwort

1

Ich denke, Ihre Vorgehensweise ist falsch. Das ist ... zu viel Code. Ich habe ein Objekt gemacht, die auf die Daten zu entsprechen scheint, Sie suchen durch:

var data = [ 
 
    { 
 
    username: "Alice", 
 
    userData : [ 
 
     { 
 
     id: 1, 
 
     someData: "hello" 
 
     }, 
 
     { 
 
     id: 2, 
 
     someData: "world" 
 
     } 
 
    ] 
 
    }, 
 
    { 
 
    username: "Bob", 
 
    userData : [ 
 
     { 
 
     id: 3, 
 
     someData: "apple" 
 
     }, 
 
     { 
 
     id: 4, 
 
     someData: "orange" 
 
     } 
 
    ] 
 
    } 
 
]; 
 

 
const findStuff = (data, lookup) => { 
 
    return data.find(
 
    item => item.userData.some(
 
     userDataItem => userDataItem.id === lookup.id 
 
    ) 
 
); 
 
} 
 

 
const shouldGetAlice  = findStuff(data, {id: 1}); 
 
const shouldBeAliceAgain = findStuff(data, {id: 2}); 
 
const shouldGetBob  = findStuff(data, {id: 3}); 
 
const shouldBeAnotherBob = findStuff(data, {id: 4}); 
 

 
console.log(shouldGetAlice.username); 
 
console.log(shouldBeAliceAgain.username); 
 
console.log(shouldGetBob.username); 
 
console.log(shouldBeAnotherBob.username);

mit .find() Beginnen Sie, weil Sie ein einzelnes Element erhalten möchten.

Innerhalb des Rückrufs verwenden Sie .some(), um die Eigenschaften userData zu überprüfen, anstatt sie selbst zu durchlaufen.

Und das ist es. Sie müssen nicht jedes Array manuell durchlaufen.

Wenn die beschreibenden Variablennamen entfernt werden, kann die Funktion

const findStuff = (data, x) => { 
    return data.find(u => u.userData.some(ud => ud.id === x.id)); 
} 

Es kann auch auf eine Zeile geschrieben werden, um

verkürzt werden, aber es scheint weniger klar.

0

eine Variable an der Spitze des Verschlusses verwenden, und zurück, dass nach den forEach.

const findStuff = (data, x) => { 
    let found; 

    data.forEach(u => { 
     u.userData.forEach(ud => { 
      const s = ud.stuff.find(s=>s.id === x.id); 
      if (s){ 
       found = s; 
      } 
     }); 
    }); 

    return found; 
}; 
0

könnten Sie Array#some verwenden und die Iteration enden mit true zurück. Sie benötigen eine Variable für den gefundenen Wert.

const findStuff = (data, x) => { 
    let found; 

    data.some(u => 
     u.userData.some(ud => { 
      const s = ud.stuff.find(s => s.id === x.id); 
      if (s) { 
       found = s; 
       return true; 
      } 
     }) 
    ); 
    return found; 
}; 
Verwandte Themen