Komma åt ett värde i en nested array
Hej! Jag har en array som ser ut ungefär såhär:
itemsArray = [{'id': 1, 'name': item1, 'ingredients': [{'name': water, 'quantity': 0 ml}] }, {'id': 2, 'name': item2, 'ingredients': [{'name': water, 'quantity': 0 ml}] ]
Jag vill komma åt ingrediensnamnet, alltså något som jag skulle vilja skriva som myArray.dish.ingredients.name, men får "TypeError: undefined is not an object (evaluating 'this.dishes.filter')" när jag försöker skriva in det i min filter-funktion som ser ut ungefär såhär:
itemsArray.filter(item => item.ingredients.name.includes(x)) där x är vad jag söker efter bland ingrediensnamnen, men som nybörjare i javascript har jag förstått att det inte funkar så med nested arrays i js, och det är därför jag söker hjälp.
Tack så mycket på förhand!
itemsArray är en lista inte en dictionary. Det kan vara smart att döpa en key till rätten. Då kan du slå upp den rätten som en propertie och ha ingredienserna som en lista där
dictionary.korvstroganoff -> listan av ingredienser till korvstroganoff.
För att utgå från ditt exempel och hjälpa dig på traven så kan vi först granska din array vars object innehåller ingredients som i sin tur är en array.
itemsArray = [{'id': 1, 'name': item1, 'ingredients': [{'name': water, 'quantity': 0 ml}] }, {'id': 2, 'name': item2, 'ingredients': [{'name': water, 'quantity': 0 ml}] ]
Då måste du i din filter function:
const flter = searchFor => itemsArray.filter(item => {
if(item.ingredients.find(i => i.name === searchFor)) {
return item
}
});
console.log(flter('water'))
Man kan också tänka sig att använda reduce:
let reduc = searchFor => itemsArray.reduce((ack, item) => {
if(item.ingredients.find(i => i.name === searchFor)) {
ack.push(item);
}
return ack;
},[])
console.log(reduc('egg'))
Ovanstående funktioner ger tillbaka hela item objectet som innehåller den ingrediens du letar efter, vet inte om du är ute efter något annat?
Aerius skrev:itemsArray är en lista inte en dictionary. Det kan vara smart att döpa en key till rätten. Då kan du slå upp den rätten som en propertie och ha ingredienserna som en lista där
dictionary.korvstroganoff -> listan av ingredienser till korvstroganoff.
Typ som detta, om man inte vill mappa om datastrukturen? :)
let findDishIngredients = dish => itemsArray.find(item => item.name === dish)['ingredients']