我有一个关于对象操作的错误

i have an error about object manipulation

大家早上好, 我在 json 的简单操作中遇到错误。 我给你看代码:

import React, {useState, useEffect} from 'react';
import Bscpricequery, {TOKEN_QUERY, bitquery} from './bscpricequery';
import Viewcoinbsc from '../../component/page/Viewcoinbsc';


function Apipricebsc() {

const [pricecontract, setPricecontract]= useState([""])

    useEffect(() => {
fetch(bitquery,{
    method: "POST",
    headers: {"content-type": "application/json",
    "X-API-KEY": "XXX"},
    body: JSON.stringify({query: TOKEN_QUERY })
}). then(response => response.json() )
.then (data => setPricecontract(data.data.ethereum.list1))
.catch(console.error);

    }, [] );
    //console.log(pricecontract)
// const listTokenBsc = pricecontract.filter((listtokenbsc) => console.log(listtokenbsc) );
 // console.log ("filtrato", listTokenBsc)
    
  return (
    <div>
      

      { pricecontract.map((listtokenbsc)=>{
        return console.log(listtokenbsc);
        
      } )}
    </div>
  )
}

export default Apipricebsc;

在最后一行有 console.log () 有了console.log(listtokenbsc),我从容收货,我只给你看1

baseCurrency: {address: '0xe9e7cea3dedca5984780bafc599bd69add087d56', symbol: 'BUSD', name: 'BUSD Token'}
block: {height: 17790981, timestamp: {…}}
quoteAmount: 7743.606417144352
quoteCurrency: {address: '0x55d398326f99059ff775485246999027b3197955', symbol: 'USDT', name: 'Tether USD'}
quotePrice: 1.006419563656451
tradeAmount: 7700.600459087681
tradeIndex: "9"
trades: 1
[[Prototype]]: Object

使用 console.log (listtokenbsc.baseCurrency),效果也很好,我得到了数据

{address: '0x0e09fabb73bd3ade0a17ecc321fd13a19e81ce82', symbol: 'Cake', name: 'PancakeSwap Token'}
address: "0x0e09fabb73bd3ade0a17ecc321fd13a19e81ce82"
name: "PancakeSwap Token"
symbol: "Cake"
[[Prototype]]: Object

而不是 console.log (listtokenbsc.baseCurrency.name) 或 console.log (listtokenbsc.baseCurrency.address) 我得到了错误 “未捕获的类型错误:无法读取未定义的属性(读取 'name')”

我不明白为什么我有这个问题。你能帮助我吗? THK

你可以试试这个:console.log(listtokenbsc.baseCurrency[address]) 如果这不起作用,您可以这样做:

Var x = listtokenbsc.baseCurrency;
console.log(x.address)

发生这种情况是因为在第一次渲染时您没有处于状态的对象,错误只是停止了代码执行。 请记住 useEffect 发生在第一次渲染之后。 listtokenbsc 最初是一个字符串(查看默认状态值)。

很可能,console.log(listtokenbsc.baseCurrency) 的结果就是成功获取后 listtokenbsc 中的结果(这样就不会发生错误)。

因此,您有几种解决方法:

// 1
if (typeof listtokenbsc === 'object' && 'name' in listtokenbsc) {
  console.log(listtokenbsc.name)
}

// 2
console.log(listtokenbsc?.baseCurrency?.name)

// 3
const [pricecontract, setPricecontract]= useState([{}])