3 svar
200 visningar
sandy99 42
Postad: 11 sep 2020 09:13

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! 

Aerius 504 – Fd. Medlem
Postad: 11 sep 2020 10:00

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.

camara 9
Postad: 16 mar 2022 21:20

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?

camara 9
Postad: 16 mar 2022 21:31
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']
Svara
Close