Найти объект в массиве

114
27 ноября 2019, 17:20

Всем привет! Я новичок, мне нужна ваша помощь, есть такой код:

var data =[
        {
            "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" }
                ]
        }
    ]

    var donutSearch = "Chocolate";
    var donutId = data.filter(function(val) {
      return val.id === donutSearch;
    })[0].id;

Мне нужно сделать так, чтобы в консоль вывелись все значения с "type": "Chocolate". Мой код выше выдает ошибку "Cannot read property 'id' of undefined" Еще я пробовал вот так:

let searchTerm = "Chocolate";
let battersId = data.find(donut => donut.type === searchTerm).id

Та же самая ошибка, что и выше

Подскажите, пожалуйста, какие-нибудь решения

Answer 1

Вот так можно если структура всегда такая как Вы написали:

let search = "Chocolate";
data.forEach(d => {
  filterAndLog(d.batters.batter);
  filterAndLog(d.topping);
});
function filterAndLog(arr){
  arr.filter(b => b.type === search).forEach(c => console.log(c))
}

var data =[ 
        { 
            "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" } 
                ] 
        } 
    ] 
 
let search = "Chocolate"; 
data.forEach(d => { 
  filterAndLog(d.batters.batter); 
  filterAndLog(d.topping); 
}); 
 
function filterAndLog(arr){ 
  arr.filter(b => b.type === search).forEach(c => console.log(c)) 
}

Вот вариант с глубоким поиском, без расчета на циклические ссылки..

let search = "Chocolate";
traverse(data)
function traverse(obj) {
  Object.keys(obj).map(key => {
    let value = obj[key];
    typeof value === "object" &&  traverse(value);
    key === "type" && value === search && console.log(obj);
  });
}

var data =[ 
            { 
                "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" } 
                    ] 
            } 
        ] 
 
let search = "Chocolate"; 
traverse(data) 
 
function traverse(obj) { 
  Object.keys(obj).map(key => { 
    let value = obj[key]; 
    typeof value === "object" &&  traverse(value); 
    key === "type" && value === search && console.log(obj); 
  }); 
}

READ ALSO
Как можно с помощью JavaScript передать файл на сервер?

Как можно с помощью JavaScript передать файл на сервер?

На счет картинки понятно - ее можно передать с помощью base64, а как файл?У меня файл 100 мб, я хочу положить его на сервер 192168

113
Прототипы в JavaScript

Прототипы в JavaScript

Учу прототипы, посмотрел этот пример у Кантора в книгезачем в скобках this прописан?

92
Предотвратить закрытие страницы

Предотвратить закрытие страницы

Ищу способ перехватить событие закрытие вкладкиУ меня имеется редактор графики, реализованный в веб - представлении, и я хочу при случайном/намеренном...

99
Использование класса js

Использование класса js

Создаю popUp в js , не получается скрыть егоПодскажите пожалуйста в чем проблема

121