如果属性并不总是存在或未定义,则遍历对象

时间:2018-11-08 10:45:20

标签: javascript reactjs object

我想在Raect中构建一个表,其中包含某个eBay列表中的手表的排序列表。我发现问题出在这行:

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

因为有时列表根本没有任何监视,在这种情况下,值watchCount根本不存在,所以我无法遍历它,尽管我尝试使用条件运算符(如果语句使用许多不同的方式)仍然会引发错误。首先,我创建了一个对象:

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;
         },{})
         
     );
}

现在我试图将它们移动到一个数组([手表数量,清单标题,商品ID])以便对其进行排序:

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 :(得分:0)

我不知道我是否完全理解这个问题。

在具有深引用的情况下,如果我不想或不能使用任何条件检查,我只需将对象路径引用放在try catch(最终)块中即可。

例如(尽管未试用)

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

也许可以解决您的问题。