Цикл по объекту, если свойство не всегда существует или не определено - PullRequest
0 голосов
/ 08 ноября 2018

Я хочу построить таблицу в Raect с отсортированным списком часов определенного списка Ebay. Я понял, что проблема в этой строке:

entriesObj[value][1][0].listingInfo[0].watchCount[0]

потому что иногда в листинге вообще нет наблюдателей, и в этом случае значение watchCount вообще не существует, поэтому я не могу пройти через него, хотя я пытался использовать условный оператор (и операторы if else во многих разных пути) все равно выдает ошибку. Сначала я создал объект:

watcherCount = () => {
    return (
         this.state.itemList.reduce((watcherObject,item) => {
             const watcherKey = item.itemId;
                 if (!watcherObject[watcherKey]) {
                     watcherObject[watcherKey] = [item];
                 } else {
                     watcherObject[watcherKey].push(item);
                     
                 }
             return watcherObject;
         },{})
         
     );
}

и теперь я пытаюсь переместить их в массив ([количество часов, название списка, идентификатор элемента]), чтобы отсортировать их:

import React from 'react';

    class Watches extends React.Component {
    
    render () {
    
        var entriesObj = Object.entries(this.props.watcherCount);
        var sortable = [];
        for (var value in entriesObj){
            for (var value in entriesObj){
                sortable.push([typeof entriesObj[value][1][0].listingInfo[0].watchCount[0] === "undefined" ? "-" : entriesObj[value][1][0].listingInfo[0].watchCount[0], entriesObj[value][1][0].title[0], entriesObj[value][0]]);
            }
         }

        sortable.sort(function(a, b) {
            return b[0] - a[0];
         });
         console.log(sortable);
    //Output: Uncaught (in promise) TypeError: Cannot read property '0' of undefined

        return <table></table>
     }
}

export default Watches;

Знаете ли вы какой-либо другой способ построения такого точного вида массива или как решить проблему с отсутствующим свойством?

1 Ответ

0 голосов
/ 08 ноября 2018

Не знаю, полностью ли я понял проблему.

В случаях с глубокими ссылками, если я не хочу или не могу использовать какие-либо условные проверки, я просто помещаю ссылку на путь объекта в блок try catch (finally).

например. (хотя и не проверено)

for (var value in entriesObj){
  var val;
  try {
    // just make sure the only error that might be occuring
    // here is an object reference error
    // therefore the array push happens after the try catch block
    val = entriesObj[value][1][0].listingInfo[0].watchCount[0], entriesObj[value][1][0].title[0], entriesObj[value][0]];
  } catch(err) {
    val = "-";
    // log the error or maybe issue a warning since missing items
    // is actually expected behaviour
  } finally {
    sortable.push(val);
  }
}

Может быть, это решит вашу проблему.

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