【问题标题】:Accessing nested json data with Hooks使用 Hooks 访问嵌套的 json 数据
【发布时间】:2021-03-21 03:15:11
【问题描述】:

我在使用 Hooks 过滤 React Typescript 中的 json 时遇到问题。 我有一个来自 fetch 的 JSON,它看起来像这样:

[
{
"dealer 1":
    [
    {
    "name": "SERVICE 1"
    "city": "NORTH CANTON"
    "phone": "3306596372"
    "isOpen": "true"
    },
    {
    "name": "SERVICE 2"
    "city": "OHIO"
    "phone": "3306596372"
    "isOpen": "true"
    }
    ]
},
{
"dealer 2":
    [
    {
    "name": "SERVICE A"
    "city": "WASHINGTON"
    "phone": "3306596375"
    "isOpen": "true"
    },
    {
    "name": "SERVICE B"
    "city": "SEATTLE"
    "phone": "3306596376"
    "isOpen": "true"
    }
    ]
}
]

我获取 api 的代码是:

useEffect(() => {
    axios.get("API URL here")
        .then(res => {
            console.log(res)
            setCTSN(res.data)
        });
}, []);

我想返回所有开放的经销商,所以我需要通过“isOpen=true”过滤它

const isOpen = 'true'

const result = OPEN
    .map(item => ({
        ...item, //Spread types may only be created from object types.ts(2698)
        children: item.children
            .filter(child => child.value.includes(isOpen.toLowerCase()))
    }))
    .filter(item => item.children.length > 0)

console.log(result)

但是我在“...item”中遇到了一个错误,我不确定我在 React Typescript 中是否正确。

有人可以帮我吗?

【问题讨论】:

    标签: javascript reactjs typescript react-native react-typescript


    【解决方案1】:

    你可以这样做

    OPEN.filter(item => item[Object.keys(item)[0]].some(service => service.isOpen))
    

    但是恕我直言你的 json 数据有问题,它看起来不像是一个好的建模。

    这种结构会更好,因此过滤更容易:

    {
    name: "dealer 1",
    services:
        [
        {
        "name": "SERVICE 1"
        "city": "NORTH CANTON"
        "phone": "3306596372"
        "isOpen": "true"
        },
        {
        "name": "SERVICE 2"
        "city": "OHIO"
        "phone": "3306596372"
        "isOpen": "true"
        }
        ]
    }
    

    然后像这样过滤...

    OPEN.filter(item => item.services.some(service => service.isOpen))
    

    【讨论】:

    • 感谢您的帮助,但由于我没有“开放和服务”变量,因此变量出现错误。 json 只是存储在一个数组中。 @cape_bsas
    • OPEN = 你的 json 数据
    • 只需使用第一个 sn-p 就可以了(我已经检查过了)
    • 嗨@cape_bsas 我不确定,但'some'会抛出一个错误,提示“'never'类型上不存在属性'some'。”
    • 我不知道您在哪里运行此代码,但 Array.prototype.some() 可从 ECMAScript 2015 获得
    【解决方案2】:

    你应该用这个方法创建你的 OPEN 数组,然后使用 map 在反应中显示它们。

    如果你在展示它们时遇到问题,请在评论中询问我的代码。

    const Json = [
      {
        "dealer 1": [
          {
            "name": "SERVICE 1",
            "city": "NORTH CANTON",
            "phone": "3306596372",
            "isOpen": true
          },
          {
            "name": "SERVICE 2",
            "city": "OHIO",
            "phone": "3306596372",
            "isOpen": false
          }
        ]
      },
      {
        "dealer 2": [
          {
            "name": "SERVICE A",
            "city": "WASHINGTON",
            "phone": "3306596375",
            "isOpen": true
          },
          {
            "name": "SERVICE B",
            "city": "SEATTLE",
            "phone": "3306596376",
            "isOpen": true
          }
        ]
      }
    ]
    const OPEN = []
    Json.forEach(item => {
       OPEN.push({
          dealer:Object.keys(item)[0],
          service:item[Object.keys(item)[0]].filter(service =>service.isOpen)
       })
    })
    console.log(OPEN)

    【讨论】:

    • 嗨@b3hr4d,感谢您的回答,但我收到错误:'Json' - 找不到名称'Json'。您指的是“JSON”吗? 'item' - 参数 'item' 隐含地具有 'any' 类型。 'service' - 参数 'service' 隐式具有 'any' 类型。
    • Json 是你的数据响应,任何一项是你的打字稿错误,你应该为它们指定类型,用于测试使用这个Json.forEach((item:any) => {
    • 感谢@b3hr4d,最后两个错误:“过滤器”表示“从不”类型上不存在属性“过滤器”“服务”表示“参数“服务”隐式具有“任何”类型。你对此有什么想法吗?
    • 我认为你应该多学习打字稿,只需在你的文件开头使用// @ts-nocheck 进行测试。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-10-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多