2017-08-01 1 views
0

Angenommen, ich habe zwei Arrays - eine als Präferenz in der Reihenfolge und eine andere den Datensatz und ich möchte das erste Element aus dem Datensatz mit übereinstimmenden ersten Präferenz.Filterung und Rückgabe Element in Array nach bestimmten Vorzug

Zum Beispiel

const userPref = ['banana', 'apple', 'peach']; 

const givenFruits = [ 
    { name: 'apple', color: 'red' }, 
    { name: 'orange', color: 'orange' }, 
    { name: 'pear', color: 'yellow' }, 
    { name: 'cherry', color: 'red' }, 
    { name: 'grape', color: 'red' }, 
    { name: 'peach', color: 'red' }, 
    { name: 'coconut', color: 'brown' } 
]; 

function findFavFruit() { 
    userPref.forEach((pref) => { 
    givenFruits.forEach((fruit) => { 
     if(pref === fruit.name) { 
      return fruit; 
     } 
    }); 
}); 
} 

console.log('findFavFruit(): ' + JSON.stringify(findFavFruit(), null, 2)); 

Diese immer wiederkehr undefined. Es soll apple NUR zurückgeben, da es Benutzer zuerst übereinstimmende Präferenz ist und zuerst in gatedFruits gefunden wird.

Was mache ich oben falsch falsch? Und gibt es einen saubereren Weg (vermeiden Sie doppelte forEach) in Javascript?

+1

Ihr 'findFavFruit' gibt nichts zurück. Denken Sie daran, 'forEach' ist eine Funktion höherer Ordnung. – Dai

Antwort

1

Sie können Schleife über die givenFruits for...of und verwenden Array.includes zu testen, ob die aktuelle Frucht innerhalb des Arrays von Lieblingsfrüchte ist ..

Beispiel:

function findFavoriteFruit(preferences, arrayOfFruits) { 
 
    for (let fruit of arrayOfFruits) { 
 
    if (preferences.includes(fruit.name)) { 
 
     return fruit; 
 
    } 
 
    } 
 
} 
 

 
const userPref = ['apple', 'banana', 'peach']; 
 

 
const givenFruits = [ 
 
    { name: 'apple', color: 'red' }, 
 
    { name: 'orange', color: 'orange' }, 
 
    { name: 'banana', color: 'yellow' }, 
 
    { name: 'pear', color: 'yellow' }, 
 
    { name: 'cherry', color: 'red' }, 
 
    { name: 'grape', color: 'red' }, 
 
    { name: 'peach', color: 'red' }, 
 
    { name: 'coconut', color: 'brown' } 
 
]; 
 

 
const favoriteFruit = findFavoriteFruit(userPref, givenFruits); 
 

 
console.log(favoriteFruit);

Diese Implementierung ist die schnellste (im Vergleich zu anderen Antworten), wie Sie here sehen können.

+0

Ich brauche 'Apfel' nur –

+1

Überprüfen Sie mein Update :). –

+0

Ich denke du meinst 'of' nicht' in', aber das wird auch nicht funktionieren. Es wäre 'userPref.includes (fruit.name)' – SimplyComplexable

1

Wählen Sie das erste Element von userPref Array zu fruit.name zu innerhalb .find() Funktion vergleichen, Ergebnis zurückgeben.

zurückzukehren nur den Eigenschaftswert, zum Beispiel "name", können Sie die Eigenschaft als String an die Funktion und Verwendung Halter Notation

const userPref = ['apple', 'banana', 'peach']; 
 

 
const [preference] = userPref; 
 

 
const givenFruits = [ 
 
    { name: 'apple', color: 'red' }, 
 
    { name: 'orange', color: 'orange' }, 
 
    { name: 'banana', color: 'yellow' }, 
 
    { name: 'pear', color: 'yellow' }, 
 
    { name: 'cherry', color: 'red' }, 
 
    { name: 'grape', color: 'red' }, 
 
    { name: 'peach', color: 'red' }, 
 
    { name: 'coconut', color: 'brown' } 
 
]; 
 

 
function findFavFruit(pref, prop, arr) { 
 
    return arr.find(fruit => pref === fruit[prop])[prop]; 
 
} 
 

 
let res = findFavFruit(preference, "name", givenFruits); 
 

 
console.log(res);

+2

Verwenden Sie Find anstelle von Filter, da nur das erste Objekt benötigt wird. – SimplyComplexable

+1

@SimplyComplexable Guter Punkt. Siehe aktualisierten Beitrag – guest271314

+0

Sorry, wenn ich nicht klar erklären.Siehe die aktualisierte Frage, die noch 'apple' zurückgeben sollte –

0

passieren kann die Eigenschaft zu verweisen und das Rück Natürlich sollten Sie einige Überprüfungen vornehmen, ob bestimmte Schlüssel vorhanden sind, aber hier ist das Grundlegende:

(givenFruits.find((v)=>{return v.name == userPref[0]})).name

Ich weiß nicht, warum über userPref zu iterieren, wenn Sie nur den ersten Schlüssel benötigen.

0

Alle oben genannten Lösungen sind korrekt, ich wollte nur klären, was das Problem mit Ihrem Code war. Siehe unten:

function findFavFruit() { 
    let userFruit; 
    userPref.forEach((pref) => { 
    givenFruits.forEach((fruit) => { 
     if(pref === fruit.name) { 
      userFruit = fruit; 
     } 
    }); 
}); 
return userFruit; 
} 

Dies würde die Frucht zurückgeben, wenn sie gefunden wurde oder undefiniert, wenn dies nicht der Fall war.

Verwandte Themen