开发者问题收集

无法读取 Javascript 中的对象属性

2021-08-31
61

我尝试使用从 api 调用中获得的一些详细信息来呈现页面。

useEffect(() =>{
  getCards();
}, [])

  const [userCards, setCards] = useState([])

  const getCards = async (event) => {
  
    let token = localStorage.getItem("user");
  
    await api
      .get("/fetch-card-balance",
      {headers:{"token":`${token}`}})
      
      .then((response) => {
        console.log(response);
        if (response.data.success === false) {
          toast.error(response.data.message);
          setCards(false);
        } else if (response.data.success === true) {
          console.log(response.data.payload)
          setCards(response.data.payload)
        }
      })
      .catch((err) => {
        toast.error(err.response.data.message);
      });
  };
  console.log(userCards)

此处 userCards 记录为

[
 {
  balance: 0.00,
  cifNumber: "0001111222",
  createdAt: "2021-08-03T12:19:51.000Z",
  first6: "123456",
  id: 1234,
  last4: "7890"
 },
 {
  balance: 20.00,
  cifNumber: "0002222333",
  createdAt: "2021-07-03T12:19:51.000Z",
  first6: "234567",
  id: 2345,
  last4: "8901"
 }
]

然后我尝试使用 forEach 来过滤我需要的属性

const cardDetails = []
    userCards.forEach(option =>  cardDetails.push(
     {
      cardNumber: `${option.first6}******${option.last4}`,
      balance: `${option.balance}`
     }
    ))

但是当我运行

console.log(cardDetails[0].balance)

我收到“Uncaught TypeError:无法读取未定义的属性‘balance’”。我已经检查了好几次,我唯一的结论是我遗漏了一些可能不那么明显的东西。有人能帮忙指出它是什么吗?

2个回答

仅当 cardDetails 中至少有一个元素时,使用 cardDetails[0].balance 才有效。否则,获取数组中的第一个元素会产生 undefined ,从而导致错误消息。由于您只在 API 请求返回后填充数组,因此至少您的第一次渲染将以空数组完成。

处理此问题的一种简单方法是先检查 if (cardDetails.length > 0)

Jotha
2021-08-31

尝试一下

const cardDetails = userCards.map(function(option) { return {cardNumber: ${option.first6}******${option.last4 , balance: ${option.balance }});

Elis Joaquim
2021-08-31