【问题标题】:How to retrieve a value from a multidimensional json array without knowing the key using javascript/jquery?如何在不知道键的情况下使用 javascript/jquery 从多维 json 数组中检索值?
【发布时间】:2019-07-12 02:10:43
【问题描述】:

我有一个包含多维数组的 json 文件。第一层是城市,第二层是温度数据。我无法从第二级动态提取值。

我尝试了以下方法:

console.log(Object.values(json[0])[3][1]) but it gives me errors.

这很好用:

console.log(Object.values(json[0])[3])

我的 JSON 代码示例如下:

[
  {
    "id": 1,
    "city": "Amsterdam",
    "country": "Netherlands",
    "monthlyAvg": [
      {
        "high": 7,
        "low": 3,
        "dryDays": 19,
        "snowDays": 4,
        "rainfall": 68
      },
      {
        "high": 6,
        "low": 3,
        "dryDays": 13,
        "snowDays": 2,
        "rainfall": 47
      },
      {
        "high": 10,
        "low": 6,
        "dryDays": 16,
        "snowDays": 1,
        "rainfall": 65
      },
      {
        "high": 11,
        "low": 7,
        "dryDays": 12,
        "snowDays": 0,
        "rainfall": 52
      },
      {
        "high": 16,
        "low": 11,
        "dryDays": 15,
        "snowDays": 0,
        "rainfall": 59
      },
      {
        "high": 17,
        "low": 11,
        "dryDays": 14,
        "snowDays": 0,
        "rainfall": 70
      },
      {
        "high": 20,
        "low": 12,
        "dryDays": 14,
        "snowDays": 0,
        "rainfall": 74
      },
      {
        "high": 20,
        "low": 12,
        "dryDays": 15,
        "snowDays": 0,
        "rainfall": 69
      },
      {
        "high": 17,
        "low": 10,
        "dryDays": 14,
        "snowDays": 0,
        "rainfall": 64
      },
      {
        "high": 14,
        "low": 9,
        "dryDays": 16,
        "snowDays": 0,
        "rainfall": 70
      },
      {
        "high": 9,
        "low": 6,
        "dryDays": 20,
        "snowDays": 1,
        "rainfall": 82
      },
      {
        "high": 7,
        "low": 1,
        "dryDays": 19,
        "snowDays": 1,
        "rainfall": 85
      }
    ]
  },
  {
    "id": 2,
    "city": "Athens",
    "country": "Greece",
    "monthlyAvg": [

我希望能够检索对应于高的值 7。 我目前可以这样说:

json[0].monthlyAvg[0].high

如何在不指定“.high”的情况下获得结果

例如,这就是我想象的代码的样子: 所以是这样的:

"high": 7 -> 我想通过输入 json[0].monthlyAvg[0][0] 之类的内容来获得 7

"low": 3 -> 我想通过输入 json[0].monthlyAvg[0][1] 之类的内容来获得 7

"dryDays": 19 -> 我想通过输入 json[0].monthlyAvg[0][2] 之类的内容来获得 7

"snowDays": 4 -> 我想通过输入 json[0].monthlyAvg[3][0] 之类的内容来获得 7

"rainfall": 68 -> 我想通过输入 json[0].monthlyAvg[0][4] 之类的内容来获得 7

【问题讨论】:

  • 所以你想通过7的值得到high的值?
  • 是的 - 所以类似于 json[0].monthlyAvg[0][0]
  • 好的,所以您基本上是在尝试在您的对象中搜索值为 7 的任何属性?
  • 不是真的 - 我只是使用值 7 作为示例。所以像这样: "high": 7 -> 我想通过输入类似 json[0].monthlyAvg[0][0] 的内容来获得 7 "low": 3 -> 我想通过输入类似 json 的内容来获得 7 [0].monthlyAvg[0][1] "dryDays": 19 -> 我想通过输入类似 json[0].monthlyAvg[0][2] "snowDays": 4 -> 我想得到 7 7 通过输入类似 json[0].monthlyAvg[3][0] "rainfall": 68 -> 我想通过输入类似 json[0].monthlyAvg[0][4] 来获得 7
  • 你能用完整的 JSON 更新你的问题吗?至少完成那里的结构。提供一个例子会更容易

标签: javascript jquery arrays json


【解决方案1】:

我认为您以错误的方式解决问题,因为有更多方便的方式来迭代数组。 看看这段代码,你可以在这里找到一个工作示例: https://codesandbox.io/s/wonderful-grothendieck-2rjze

jsonData.forEach(cityObject => {
  console.log(
    `*** Printing data for ${cityObject.city}, ${cityObject.country} ***`
  );

  cityObject.monthlyAvg.forEach(avg => {
    let stringStat = "";

    for (const key in avg) {
      let value = avg[key];

      if (stringStat.length > 0) stringStat += ", ";

      stringStat += `${key}: ${value}`;
    }

    console.log(stringStat);
  });
});

【讨论】:

  • 感谢 Renato,我目前正在创建一个表格并通过下拉列表对其进行过滤。有没有办法只显示我的下拉列表中的值?
  • 下拉菜单中有哪些选项?
【解决方案2】:
Object.values(Object.values(json[0])[3][0])

现在您可以使用 0、1、2、3,4 选择高、低、干等。

例子

Object.values(Object.values(json[0])[3][0])[0]

将返回 7(来自阿姆斯特丹的月平均高点)

解释

let flattenedJson = Object.values(json[0]);

如您所说,这将返回数组中的值。但是,第三个索引仍然是一个对象。

let monthlyAVG = flattenedJson[3][n];

其中 n 是您要选择的数据的索引。这将返回带有 high、low、dryDays 等键的对象。

let flattenedData = Object.values(monthlyAVG);

现在我们已经将之前的对象展平为任意数组。

let high = flattenedData[0]

这就是它的工作原理。希望有道理。

【讨论】:

  • 你能解释一下它的结构是如何工作的吗?或者如果有一个你可以分享的链接可以提供一些信息?
  • Object.values 按某种顺序返回值,但不一定是它们在 JSON 中出现的顺序,这意味着这会给你一个来自阿姆斯特丹的随机值,最坏的情况是一个错误(当 @987654329 @ 不是 monthlyAvg,因为 3 只是一个任意条目,而不是 JSON 中的第四个条目。
  • 谢谢@PalashSharma 如果我想获取密钥,是否会是以下内容: Object.keys(Object.keys(json[0])[3][0])[0]) ?
  • 这是一篇在Object.values 甚至存在之前的过时文章。它是关于 EcmaScript (ES6) 的单一版本,但 ES7 摆脱了为 Object.keys 定义的排序,而 ES8 也没有它。没有任何版本为Object.values 定义过顺序。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-11-14
  • 2020-01-12
  • 2022-08-18
  • 2020-10-16
  • 2016-05-12
  • 2017-03-05
  • 1970-01-01
相关资源
最近更新 更多