【问题标题】:Cannot read properties of undefined (reading 'size')无法读取未定义的属性(读取“大小”)
【发布时间】:2021-09-16 21:08:15
【问题描述】:

我有 2 个数组。我在 arr1 上使用 for 循环并检查 arr2 是否包含与 arr1 中相同的鞋码。如果条件检查到 arr2 中不存在来自 arr1 的鞋码,则它将一个对象 ({size: '-'}) 推送到 newArr,如果确实存在,它将只是将来自 arr2 的鞋对象推送到 newArr

代码:

const newArr = []
    const arr1 = [
        { size: 'US 3' },
        { size: 'US 4' },
        { size: 'US 5' },
        { size: 'US 6' },
        { size: 'US 7' },
        { size: 'US 8' },
        { size: 'US 9' },
        { size: 'US 10' },
        { size: 'US 11' },
        { size: 'US 12' },
        { size: 'US 13' },
        { size: 'US 14' },
        { size: 'US 15' },
        { size: 'US 16' }
    ]
    const arr2 = [
        { size: '4', cost: '170' },
        { size: '6', cost: '75' },
        { size: '7', cost: '75' },
        { size: '8', cost: '78' },
        { size: '9', cost: '80' },
        { size: '10', cost: '85' },
        { size: '11', cost: '73' },
        { size: '12', cost: '77' },
        { size: '14', cost: '100' }
    ]

     for (const arr1Item in arr1) {
         let arr1Size = arr1[arr1Item].size
         let includes = arr1Size.includes(arr2[arr1Item].size);
    
         if(includes) {
           newArr.push(arr2[arr1Item])
         } else {
           newArr.push({size: '-'})
         }
      }
 
 console.log(newArr)

问题是每当我运行它时,我都会收到此错误:TypeError: Cannot read properties of undefined (reading 'size')

由于这里的代码而发生此错误:

arr2[arr1Item].size

我感到困惑的是,如果我 console.log(arr2[arr1Item]) 在 for 循环中,它会从 arr2 返回每个对象而没有错误,只有在我添加 .size 时才会出错。

我在这方面被困了一段时间,如果有任何帮助,我将不胜感激。谢谢。

【问题讨论】:

    标签: javascript arrays


    【解决方案1】:

    您使用索引变量arr1Item 迭代arr1,然后使用它来索引arr2。由于arr1 的元素比arr2 多,您最终会尝试访问arr2[9] === undefined,而undefined 没有大小属性​​,因此会出现错误TypeError: Cannot read properties of undefined (reading 'size')

    其他几个问题

    1. newArr 不是常量。

    2. Array.protoype.includes() 用于查看,例如,arr2.size 中的 4 是否与 arr.size 匹配,例如 US 4,但这也会错误地(子字符串)匹配 US 14

    可能的解决方案

    使用arr1arr2 都按(标准化)size 属性排序的事实,并且(标准化)arr2.size 的集合是(标准化)arr1.size 的子集,您可以在线性时间内进行转换 (O(arr1.length)):

    const arr1 = [
        { size: 'US 3' },
        { size: 'US 4' },
        { size: 'US 5' },
        { size: 'US 6' },
        { size: 'US 7' },
        { size: 'US 8' },
        { size: 'US 9' },
        { size: 'US 10' },
        { size: 'US 11' },
        { size: 'US 12' },
        { size: 'US 13' },
        { size: 'US 14' },
        { size: 'US 15' },
        { size: 'US 16' }
    ]
    const arr2 = [
        { size: '4', cost: '170' },
        { size: '6', cost: '75' },
        { size: '7', cost: '75' },
        { size: '8', cost: '78' },
        { size: '9', cost: '80' },
        { size: '10', cost: '85' },
        { size: '11', cost: '73' },
        { size: '12', cost: '77' },
        { size: '14', cost: '100' }
    ]
    
    let newArr = []
    for(let i1 = 0, i2 = 0; i1 < arr1.length; i1++) {
            if(i2 < arr2.length && arr1[i1].size.substr(3) === arr2[i2].size) {
                    newArr.push(arr2[i2]);
                    i2++;
            } else {
                    newArr.push({size: '-'});
            }
    }
    console.log(newArr)

    【讨论】:

      【解决方案2】:

      我认为您想使用过滤器进行匹配。

      let newArr = []
      const arr1 = [
        { size: 'US 3' },
        { size: 'US 4' },
        { size: 'US 5' },
        { size: 'US 6' },
        { size: 'US 7' },
        { size: 'US 8' },
        { size: 'US 9' },
        { size: 'US 10' },
        { size: 'US 11' },
        { size: 'US 12' },
        { size: 'US 13' },
        { size: 'US 14' },
        { size: 'US 15' },
        { size: 'US 16' }
      ]
      const arr2 = [
        { size: 'US 4', cost: '170' },
        { size: '6', cost: '75' },
        { size: '7', cost: '75' },
        { size: '8', cost: '78' },
        { size: '9', cost: '80' },
        { size: '10', cost: '85' },
        { size: '11', cost: '73' },
        { size: '12', cost: '77' },
        { size: '14', cost: '100' }
      ]
        
      arr1.forEach(a1Item => {
        let foundItems = arr2.filter(a2Item => a2Item.size === a1Item.size);
        // OR PARTIAL MATCH (arr1.size '4' would match arr2.size 'US 4')
        // let foundItems = arr2.filter(a2Item => a2Item.size.includes(a1Item.size));
      
        if (foundItems.length > 0) {
          foundItems.forEach(fItem => {
            newArr.push(fItem);
          });
        } else {
          // ADDED COST TO KEEP ITEMS CONSISTENT
          newArr.push({size: '-', cost: '-'});
        }
      });
      
      console.log(newArr);

      【讨论】:

      • 干得好!即使您拥有的第一个解决方案也很好,而且这个修改后的解决方案的输出可能比 op 要求的更有用。建议删除输出 cmets,因为运行代码 sn -p 将按需生成。
      猜你喜欢
      • 2021-09-15
      • 2020-06-20
      • 2021-03-09
      • 2023-03-11
      • 2022-01-15
      • 2021-12-31
      • 2021-12-13
      • 2021-11-28
      • 2021-11-15
      相关资源
      最近更新 更多