Как извлечь значение из многомерного массива json, не зная ключа, используя javascript / jquery? - PullRequest
0 голосов
/ 12 июля 2019

У меня есть файл 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 -> Я хочу получить 7, набрав что-то вроде json [0] .monthlyAvg [0] [0]

"low": 3 -> Я хочу получить 7, набрав что-то вроде json [0] .monthlyAvg [0] [1]

"dryDays": 19 -> Я хочу получить 7, набрав что-то вроде json [0] .monthlyAvg [0] [2]

"snowDays": 4 -> Я хочу получить 7, набрав что-то вроде json [0] .monthlyAvg [3] [0]

"rainfall": 68 -> Я хочу получить 7, набрав что-то вроде json [0] .monthlyAvg [0] [4]

Ответы [ 2 ]

0 голосов
/ 12 июля 2019

Я думаю, что вы подходите к проблеме неправильно, поскольку есть более удобные способы перебора массивов.Посмотрите на этот код, вы можете найти рабочий пример здесь: 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);
  });
});
0 голосов
/ 12 июля 2019
Object.values(Object.values(json[0])[3][0])

Теперь вы можете выбрать высокий, низкий, сухой и т. Д. С 0, 1, 2, 3,4.

Пример

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

Вернется 7 (от месячной средней цены)of Amsterdam)

Объяснение

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

Возвращает значения в массиве, как вы сказали.Однако thrid-индекс по-прежнему является объектом.

let monthlyAVG = flattenedJson[3][n];

Где n - это индекс данных, которые вы хотите выбрать.Это вернет объект с ключами high, low, dryDays и т. Д.

let flattenedData = Object.values(monthlyAVG);

Теперь мы сравняли предыдущий объект с любым массивом.

let high = flattenedData[0]

Вот как это работает.Надеюсь, это имеет смысл.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...