You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用map/filter后变量ready返回数组而非预期值,求解答

问题:为何处理JSON时'ready'变量返回数组而非预期单个值?

我在处理JSON数据时,对变量'ready'的输出感到困惑:原本期望它获取到单个值'true',但实际返回数组['false', 'true'],导致无法进入预设的条件分支。请问为何会返回包含多个结果的数组而非预期的单个值?

示例JSON

{
  "data": {
    "competition": [
      {
        "events": [
          {
            "field": [
              {
                "ready": "true",
                "__typename": "Field"
              },
              {
                "ready": "true",
                "__typename": "Field"
              },
              {
                "ready": "true",
                "__typename": "Field"
              }
            ],
            "__typename": "Event"
          },
          {
            "field": [
              {
                "ready": "true",
                "__typename": "Field"
              },
              {
                "ready": "true",
                "__typename": "Field"
              },
              {
                "ready": "true",
                "__typename": "Field"
              }
            ],
            "__typename": "Event"
          }
        ],
        "__typename": "Competition"
      }
    ]
  }
}

问题代码

export function dailyListConverter(list) {
  const ready = JSON.parse(list)
    .data.competition[0].events.filter((event) => event.field)
    .map((event) => event.field[0].ready);
  if (ready === "true") {
    console.log("I'M HERE")
  }
  console.log("OUTSIDE CONDITIONS")
}

原因分析

问题出在你使用的filter和map方法的特性上:

  • filter((event) => event.field)会遍历events数组的所有元素,保留所有event.field存在的元素。你的示例JSON中events包含2个符合条件的元素,因此filter返回一个包含2个元素的数组。
  • 后续的map方法会对这个数组里的每个元素执行event.field[0].ready,并将每个结果收集成新数组,最终ready变量是一个包含2个'true'的数组,而非单个值。这也是你用ready === "true"判断永远不成立的原因——数组和字符串永远不会全等。

解决方案

根据你的需求不同,有两种常见的调整方式:

1. 获取第一个符合条件的元素的'ready'值

如果你只需要第一个存在field的event对应的ready值,用find代替filter(find返回第一个满足条件的元素,而非数组):

export function dailyListConverter(list) {
  const targetEvent = JSON.parse(list)
    .data.competition[0].events.find((event) => event.field);
  const ready = targetEvent?.field[0].ready; // 可选链避免找不到元素时报错
  if (ready === "true") {
    console.log("I'M HERE")
  }
  console.log("OUTSIDE CONDITIONS")
}

2. 判断所有符合条件的元素的'ready'值都是'true'

如果你需要确认所有存在field的event对应的ready都是'true',用every方法:

export function dailyListConverter(list) {
  const allReady = JSON.parse(list)
    .data.competition[0].events.filter((event) => event.field)
    .every((event) => event.field[0].ready === "true");
  if (allReady) {
    console.log("I'M HERE")
  }
  console.log("OUTSIDE CONDITIONS")
}

内容的提问来源于stack exchange,提问作者BruceyBandit

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.03 01:21:06