Object.keys( props.ingredients )
возвращает массив имен ингредиентов.
.map( igKey => {
сопоставляет этот массив с новым массивом, где каждый элемент содержит
[...Array( props.ingredients[igKey] )]
массив, который имеет столько же записей, сколько и значение, относящееся к ингредиенту в переданном объекте.
.map( (_, i) => {
затем сопоставляет этот внутренний массив, игнорирует значение (которое в любом случае равно undefined
для пустого массива) и берет только индекс и сопоставляет его с
<BurgerIngredient key={igKey + i} type={igKey} />;
Теперь мыу меня есть двумерный массив BurgerIngredients, и
.reduce((arr, el) => {
return arr.concat(el);
}, []);
выравнивает его до массива BurgerIngredients. Сокращение означает, что мы начинаем с начального значения ([]
) и .concat
каждого значения (внутреннего массива) исходного массива.
Я бы написал так:
const Burger = ({ ingredients }) => {
const list = [];
for(const [ingredient, amount] of Object.entries(ingredients)) {
for(let count = 0; count < amount; count++) {
list.push(<BurgerIngredient key={ingredient + count} type={ingredient} />);
}
}
return <div className="burger">
Ingredients:
{list}
</div>;
};