Сопоставление/копание в массиве, вложенном в объект — JavaScript

#javascript #jquery #arrays #mapping

Вопрос:

Это мой первый вопрос о переполнении стека. Я пытаюсь отобразить массив, размещенный внутри объекта. Мой вопрос больше касается таргетинга, чем самого процесса сопоставления (я думаю). Цель моего кода-сопоставить массив с этой целью:

 var target = {
                        "id": 1, //as an int
                        "type": "donut",
                        "name": "Cake",
                        "ppu": 0.55,
                        "batters": "all of the batter types as a string",
                        "ingredients": [],//a copy of all the toppings
                        "countOfFillings": 0 
    } 

объектом, о котором идет речь, является:

 var bakery = {
    "items":
        {
            "item":
                [
                    {
                        "id": "0001",
                        "type": "donut",
                        "name": "Cake",
                        "ppu": 0.55,
                        "batters":
                            {
                                "batter":
                                    [
                                        { "id": "1001", "type": "Regular" },
                                        { "id": "1002", "type": "Chocolate" },
                                        { "id": "1003", "type": "Blueberry" },
                                        { "id": "1004", "type": "Devil's Food" }
                                    ]
                            },
                        "topping":
                            [
                                { "id": "5001", "type": "None" },
                                { "id": "5002", "type": "Glazed" },
                                { "id": "5005", "type": "Sugar" },
                                { "id": "5007", "type": "Powdered Sugar" },
                                { "id": "5006", "type": "Chocolate with Sprinkles" },
                                { "id": "5003", "type": "Chocolate" },
                                { "id": "5004", "type": "Maple" }
                            ]
                    },
                    {
                        "id": "0002",
                        "type": "donut",
                        "name": "Raised",
                        "ppu": 0.55,
                        "batters":
                            {
                                "batter":
                                    [
                                        { "id": "1001", "type": "Regular" }
                                    ]
                            },
                        "topping":
                            [
                                { "id": "5001", "type": "None" },
                                { "id": "5002", "type": "Glazed" },
                                { "id": "5005", "type": "Sugar" },
                                { "id": "5003", "type": "Chocolate" },
                                { "id": "5004", "type": "Maple" }
                            ]
                    },
        
                    {
                        "id": "0003",
                        "type": "donut",
                        "name": "Old Fashioned",
                        "ppu": 0.55,
                        "batters":
                            {
                                "batter":
                                    [
                                        { "id": "1001", "type": "Regular" },
                                        { "id": "1002", "type": "Chocolate" }
                                    ]
                            },
                        "topping":
                            [
                                { "id": "5001", "type": "None" },
                                { "id": "5002", "type": "Glazed" },
                                { "id": "5003", "type": "Chocolate" },
                                { "id": "5004", "type": "Maple" }
                            ]
                    },
                    {
                        "id": "0004",
                        "type": "bar",
                        "name": "Bar",
                        "ppu": 0.75,
                        "batters":
                            {
                                "batter":
                                    [
                                        { "id": "1001", "type": "Regular" },
                                    ]
                            },
                        "topping":
                            [
                                { "id": "5003", "type": "Chocolate" },
                                { "id": "5004", "type": "Maple" }
                            ],
                        "fillings":
                            {
                                "filling":
                                    [
                                        { "id": "7001", "name": "None", "addcost": 0 },
                                        { "id": "7002", "name": "Custard", "addcost": 0.25 },
                                        { "id": "7003", "name": "Whipped Cream", "addcost": 0.25 }
                                    ]
                            }
                    },

                    {
                        "id": "0005",
                        "type": "twist",
                        "name": "Twist",
                        "ppu": 0.65,
                        "batters":
                            {
                                "batter":
                                    [
                                        { "id": "1001", "type": "Regular" },
                                    ]
                            },
                        "topping":
                            [
                                { "id": "5002", "type": "Glazed" },
                                { "id": "5005", "type": "Sugar" },
                            ]
                    },

                    {
                        "id": "0006",
                        "type": "filled",
                        "name": "Filled",
                        "ppu": 0.75,
                        "batters":
                            {
                                "batter":
                                    [
                                        { "id": "1001", "type": "Regular" },
                                    ]
                            },
                        "topping":
                            [
                                { "id": "5002", "type": "Glazed" },
                                { "id": "5007", "type": "Powdered Sugar" },
                                { "id": "5003", "type": "Chocolate" },
                                { "id": "5004", "type": "Maple" }
                            ],
                        "fillings":
                            {
                                "filling":
                                    [
                                        { "id": "7002", "name": "Custard", "addcost": 0 },
                                        { "id": "7003", "name": "Whipped Cream", "addcost": 0 },
                                        { "id": "7004", "name": "Strawberry Jelly", "addcost": 0 },
                                        { "id": "7005", "name": "Rasberry Jelly", "addcost": 0 }
                                    ]
                            }
                    }
                ]
        }
} 

И это моя попытка составить карту. Я могу сгенерировать массив, но только из первого элемента в массиве, как указано в [0]. Любые отзывы или советы будут высоко оценены!

     var exampleTest = bakery.items.item.map(mapCake);
    function mapCake (aCake)
    {
        let newType = `${bakery.items.item[1].type}` 
         
        let result = {id: `${bakery.items.item[0].id}`,
                    type: newType,
                    name: `${bakery.items.item[0].name}`,
                    ppu: `${bakery.items.item[0].ppu}`,
                    batters: [`${bakery.items.item[0].batters.batter}`],
                    ingredients: `${bakery.items.item[0].topping}`,
                    countOfFillings: `${bakery.items.item[0].fillings}`.length};

        return  result

    } 

Ответ №1:

Попробуйте это:

 function mapCake(aCake) {
  let newType = `${aCake.type}`;

  let result = {
    id: `${aCake.id}`,
    type: newType,
    name: `${aCake.name}`,
    ppu: `${aCake.ppu}`,
    batters: [`${aCake.batters.batter}`],
    ingredients: `${aCake.topping}`,
    countOfFillings: `${aCake.fillings}`.length
  };

  return resu<
}
 

Похоже, что в вашей функции вы каждый раз напрямую индексируете определенный товар для выпечки.

Ваш aCake параметр еще не использовался, на каждой итерации aCake он ссылается на текущий элемент, который повторяется повторно — так что это то, чем вы хотите заполнить свои значения результатов.

Комментарии:

1. Большое вам спасибо за помощь. В этом есть смысл. Зачем иметь параметр, если вы его не используете. Еще раз спасибо за потраченное время!