Как не нарушать код JavaScript, если объект не существует? - PullRequest
0 голосов
/ 23 декабря 2011

Я играю с некоторыми YQL , и возвращаемый результат возвращается как JSON.Поэтому я пытаюсь запустить его, используя какой-то JavaScript.Все работает нормально, но когда дело доходит до одного элемента, который я хотел бы получить, мой код JavaScript ломается.

Это часть моего JSON:используя следующий фрагмент кода JavaScript, чтобы захватить содержимое, которое я хочу.

function cbfunc(o){
    var items = o.query.results.li;
    var output = '';
    var no_items=items.length;
    for(var i=0;i<no_items;i++){
        var img = items[i].div[0].p.a.img.src;
        var price1 = items[i].div[1];
        var price = price1.span.span.content;
        var title = items[i].h5.a.content;
        var link = items[i].h5.a.href;
        var desc = items[i].description;
        output += "<img src='" + img + "' /><h3><a href='" + link + "'>"+title+"</a></h3>" + price + "<hr/>";
    }
    // Place product in div tag
    document.getElementById('results').innerHTML = output;
}

Как вы, вероятно, видите, я перебираю все li и пытаюсь распечататьиз каждого li изображения, ссылки, названия и цены.Почти все работает, но когда я пытаюсь получить цену каждого продукта, мой JavaScript ломается.Я обнаружил, что один или два из li, через которые я перебираю, не имеют span.span.content, вместо этого у них есть p.span.content.Это означает, что в некоторых случаях код не может найти span.span.content, а затем он ломается.

Почему это происходит?Есть ли решение, что я могу сделать, чтобы это не сломалось?Возможно ли иметь какой-то запасной вариант по умолчанию для предметов, которые не получили span.span.content или что-то подобное?

1 Ответ

2 голосов
/ 23 декабря 2011

Не могу сказать, почему это происходит так, но это исправит только этот сценарий:

var price = price1.span ? price1.span.span.content : price1.p.span.content;

Или чуть более компактно:

var price = (price1.span ? price1.span : price1.p).span.content;

Или, если быбыть другими видами промежутков, которые вы хотите избежать и должны быть более тщательными:

var price = price1.span && price1.span.span && price1.span.span.content ? price1.span.content : (price1.p && price1.p.span && price1.p.span.content ? price1.p.span.content : null);

Или вы можете разбить его на троичный, если на это слишком много смотреть:Наконец, если вы согласны с тем, что цена не определена, вы можете немного сократить вышеуказанное с помощью этого:

var price;

if (price1.span && price1.span.span) {
    price = price1.span.content;
} else if (price1.p && price1.p.span) {
    price = price1.p.span.content;
} else {
    price = null;
}
...