как отобразить и создать массив внутри объекта - PullRequest
0 голосов
/ 19 февраля 2020

Итак, у меня есть объект, который я пытаюсь отобразить:

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" }
                      ]
                 },
                 ...
                 ...
                 ...
            ]
        }
}

Это целевой результат

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
}];

А вот моя функция отображения

//  creates variable bakeryArray that contains the actual Array inside of Baker var
var bakeryArray = bakery.items.item

//  newCakes var invoked map function with the bakeryArray
var newCakes = bakeryArray.map(mapCakes)

function mapCakes(oldCakes) {
    let batter = oldCakes.batters.batter
    console.log(batter, "batter Logged")
    var newCakesObject = {
        type: oldCakes.type,
        name: oldCakes.name,
        ppu: oldCakes.ppu,
        batters: batter.type,
        ingredients: "ingridients",
        countOfFillings: "total number of ingrediensts"
    };
    return newCakesObject;
};

У меня проблемы с получением Batter, Ingredients и countOfFillings из старого объекта в новый.

Единственное, что я могу придумать, чтобы получить тестеры в newCakesObject, - это то, что мне нужно создать еще одну картографическую функцию для теста (я опишу это ниже)? а затем вызвать это в функции mapCakes под batters? но каждый раз, когда я создаю для этого другую функцию, я получаю сообщение о том, что она не определена, когда я вызываю newBatterArray в консоли

var newBatterArray = bakeryArray.map(mapBatters)
function mapBatters(oldarray) {
    let theBatters = oldarray.batters.batter
    console.log(theBatters.type, "we ran")
    var newBatters = {
        type: theBatters.type
    }
    return newBatters;
}

1 Ответ

0 голосов
/ 19 февраля 2020

Чтобы получить более четкую интерпретацию вашего bakery объекта, я немного его подправил

var bakery = {
    "items":[
        {
          "id": "0001",
          "type": "donut",
          "name": "Cake",
          "ppu": 0.55,
          "batters":[
            { "id": "1001", "type": "Regular" },
            { "id": "1002", "type": "Chocolate" },
            { "id": "1003", "type": "Blueberry" },
            { "id": "1004", "type": "Devil's Food" }
          ],
          "toppings":[
            { "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": "Cake",
          "ppu": 0.65,
          "batters":[
            { "id": "1001", "type": "Regular1" },
            { "id": "1002", "type": "Chocolate1" },
            { "id": "1003", "type": "Blueberry1" },
            { "id": "1004", "type": "Devil's Food1" }
          ],
          "toppings":[
            { "id": "5001", "type": "None1" },
            { "id": "5002", "type": "Glazed1" },
            { "id": "5005", "type": "Sugar1" },
            { "id": "5007", "type": "Powdered Sugar1" },
            { "id": "5006", "type": "Chocolate with Sprinkles1" },
            { "id": "5003", "type": "Chocolate1" },
            { "id": "5004", "type": "Maple1" }
          ]
        },
        ...
        ...
        ...
        ...
    ]
}

Теперь вы можете перебирать каждый элемент и строить свой массив target следующим образом

var target = [];

// define reducer function for each item in bakery.items
const reduceToTarget = item => {
    var obj = {};
    obj.id = item.id;
    obj.type = item.type;
    obj.name = item.name;
    obj.ppu = item.ppu;
    obj.batters = '';
    item.batters.forEach(b => obj.batters+=b.type+'|');
    obj.ingredients = item.toppings;
    target.push(obj);
}

// Now you can call the reduceToTarget function to get the desired target list/array
bakery.items.forEach(reduceToTarget);

Вывод для этого выглядит примерно так

target = [
  {
    id: "0001"
    type: "donut"
    name: "Cake"
    ppu: 0.55
    batters: "Regular|Chocolate|Blueberry|Devil's Food|",
    ingredients : [/* list of ingredients*/]
  },
  {
    id: "0002"
    type: "donut"
    name: "Cake"
    ppu: 0.65
    batters: "Regular|Chocolate|Blueberry|Devil's Food|",
    ingredients : [/* list of ingredients*/]
  }
]

ПРИМЕЧАНИЕ:

Для получения countOfFillings вы можете просто вызвать функцию length() на вашем ingredients список для любого элемента в target

...