Javascript: как учитывать неопределенный JSON, который прерывает цикл - PullRequest
0 голосов
/ 14 октября 2019

У меня проблемы и, возможно, я подхожу к этому неправильно, поэтому открыты для других решений. Из вызова извлечения я получаю больший массив объектов json, который имеет дополнительную вложенность в каждом объекте. Я хочу уменьшить массив объектов большего размера до нескольких значений (для каждого объекта), и в настоящее время я делаю это, перебирая все объекты в массиве большего размера и получая значения, которые я хочу получить от каждого объекта, а затем передавая их зановосоздал больший массив. Приведенный ниже код работает иногда, однако бывают случаи, когда в некоторых значениях из json отсутствует цикл for, прерывающий цикл for. Например, data.products[i].images[0].src в данном объекте иногда не определено, что прерывает цикл, говорящий «не может прочитать свойство .src of undefined», и не повторяется до конца.

Основные вопросы?
1. Как я могу учесть неопределенные значения в любой заданной паре ключ: значение без разрыва цикла
2. Есть ли лучший способ пойтиоб этом целиком?


Я могу отредактировать ответ, включив в него пример входящего json, если это вообще поможет

Редактировать
Я также хочуне включать какой-либо объект, который привел к неопределенному изображению в конечном массиве. Есть ли способ предотвратить добавление этого объекта или, возможно, отфильтровать его позже?

let productFilter = []

fetch('https://some.json')
    .then(
        function (response) {
            response.json().then(function (data) {

                for (var i = 0; i < data.products.length; i++) {

                    let filteredArray = {

                        "productId": data.products[i].id,
                        "productName": data.products[i].title,
                        "productImg": data.products[i].images[0].src

                    }

                    productFilter.push(filteredArray)

                }

            });
        }
    )
    .catch(function (err) {
        console.log('Fetch Error', err);
    })

Ответы [ 3 ]

2 голосов
/ 14 октября 2019

используйте условное выражение:

"productImg": data.products[i].images[0] ? data.products[i].images[0].src : "put default image URL here"

Если вы вообще не хотите, чтобы эти объекты в массиве, просто поместите тест вокруг всего кода, который добавляет объект.

if (data.products[i].images[0]) {
    let filteredArray = {
        "productId": data.products[i].id,
        "productName": data.products[i].title,
        "productImg": data.products[i].images[0].src
    }
    productFilter.push(filteredArray)
}
0 голосов
/ 14 октября 2019

Вам необходимо проверить, существует ли data.products [i], в противном случае вы пытаетесь сослаться на свойства неопределенного объекта. Та же логика применяется для ссылки нижнего уровня на изображения [0] .src

let productFilter = []


fetch('https://some.json')
    .then(
        function (response) {
            response.json().then(function (data) {

                for (var i = 0; i < data.products.length; i++) {
                  if (data.products[i]) {
                    let filteredArray = {

                        "productId": data.products[i].id,
                        "productName": data.products[i].title,
                       // "productImg": data.products[i].images[0].src

                    }

                    if (data.products[i].images[0]) {
                      filteredArray.productImg = data.products[i].images[0].src;
                    }

                    productFilter.push(filteredArray)
                  } 

                }

            });
        }
    )
    .catch(function (err) {
        console.log('Fetch Error', err);
    })
0 голосов
/ 14 октября 2019

Для exampledata.products[i].images[0].src в данном объекте иногда не определено, что прерывает цикл, говоря: «не могу прочитать свойство .src of undefined»

Ошибка говорит вам, что exampledata.products[i].images[0]undefined, а не exampledata.products[i].images[0].src сам. Чтобы справиться с этим, вы можете добавить простой оператор if внутри вашего цикла for:

let filteredArray = {
    "productId": data.products[i].id,
    "productName": data.products[i].title,
}

if (exampledata.products[i].images[0]) {
    filteredArray.productImg = exampledata.products[i].images[0].src
}

Обратите внимание, что это решение пропустит клавишу productImg, когда изображения нет. Кроме того, вы можете использовать ответ Бармара, если хотите убедиться, что ключ всегда существует и имеет соответствующий стандарт по умолчанию, будь то URL по умолчанию или просто undefined.

Предложения:

  1. Используйте переменную для сокращения многих строк в вашем коде:

    product = exampledata.products[i];
    

    Теперь вы можете сделать product.id и т. Д.

  2. Проверьте функцию map() массива. Вы можете сделать то же самое, что и здесь, без написания всего кода шаблона для цикла for.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...