Как получить доступ к определенному элементу во вложенном массиве в данных JSON с помощью JavaScript? - PullRequest
0 голосов
/ 25 февраля 2019

У меня есть данные JSON, которые структурированы, как показано ниже.Намерение состоит в том, чтобы найти определенную точку данных, например, годовую прибыль, которая составляет 5000.

Я хочу сделать это, найдя столбец по имени, например, «прибыль», определив индекс столбца (3 в примере)и затем используйте индекс столбца, чтобы выбрать n-й (3-й) элемент во втором узле ("годовом") массива "данных".

Как я могу сделать это, используя функцию findIndex() в Javascript (см. Ключевую часть моего кода ниже)?

Данные JSON:

{
  "datatable": {
    "data": [
      [
        "AAPL",
        "quarterly",
        1000,
        2000
      ],
      [
        "AAPL",
        "annual",
        5000,
        10000
      ]
    ],
    "columns": [{
        "name": "ticker"
        "type": "String"
      },
      {
        "name": "timedim"
        "type": "String"
      },
      {
        "name": "profit",
        "type": "Integer"
      },
      {
        "name": "revenue",
        "type": "Integer"
      }
    ]
  }
}

Код JavaScript:

  // daten contains the "data" array of the JSON dataset
  // spalten contains the "columns" array of the JSON dataset
  
  var i = spalten.findIndex(obj => obj.name == "profit");
  output += '<p>Annual profit AAPL: ' + daten[i] + '</p>';
  elroot.innerHTML += output;

Ответы [ 4 ]

0 голосов
/ 25 февраля 2019

Вам не нужно findIndex - просто используйте find и includes примерно так:

const data = {
  "datatable": {
    "data": [
      [
        "AAPL",
        "quarterly",
        1000,
        2000
      ],
      [
        "AAPL",
        "annual",
        5000,
        10000
      ]
    ],
    "columns": [{
        "name": "ticker",
        "type": "String"
      },
      {
        "name": "timedim",
        "type": "String"
      },
      {
        "name": "profit",
        "type": "Integer"
      },
      {
        "name": "revenue",
        "type": "Integer"
      }
    ]
  }
};

function findValue(type) {
  return data.datatable.data.find(e => e.includes(type))[2];
}

console.log(findValue("annual"));
console.log(findValue("quarterly"));
0 голосов
/ 25 февраля 2019

На основе указанной вами структуры JSON сработает следующее.Написание функции было бы хорошо, если вы хотите получать конкретную прибыль на основе параметров.

  var output = ""
  function getProfit(type="annual", column=2) {
    var arrForType = yourData.datatable.data.find(arr => arr.indexOf(type) !== -1);
    return arrForType[column];
  }

  var i = yourData.datatable.columns.findIndex(obj => obj.name == "profit");
  output += '<p>Annual profit AAPL: ' + getProfit("annual", i) + '</p>';
  document.body.innerHTML += output;

0 голосов
/ 25 февраля 2019

У вас есть массив 2-dimensional, поэтому вам нужно два индекса:

const json = {
  "datatable": {
    "data": [
      [
        "AAPL",
        "quarterly",
        1000,
        2000
      ],
      [
        "AAPL",
        "annual",
        5000,
        10000
      ]
    ],
    "columns": [{
        "name": "ticker",
        "type": "String"
      },
      {
        "name": "timedim",
        "type": "String"
      },
      {
        "name": "profit",
        "type": "Integer"
      },
      {
        "name": "revenue",
        "type": "Integer"
      }
    ]
  }
}
var profitIndex = json.datatable.columns.findIndex(item => item.name == 'profit');
var annualIndex = json.datatable.data.findIndex(array => array.indexOf('annual') > -1);
var annualProfit = json.datatable.data[annualIndex][profitIndex];

Если вам нужна функция, она может выглядеть следующим образом:

var getValueFromJson = function (json, columnName, dataMarker) {
    var columnIndex = json.datatable.columns.findIndex(item => item.name == columnName);
    var dataMarkerIndex = json.datatable.data.findIndex(array => array.indexOf(dataMarker) > -1);
    if (columnIndex < 0 || dataMarkerIndex < 0) {
        return null;
    }
    return json.datatable.data[dataMarkerIndex][columnIndex];
}

console.log(getValueFromJson(json, 'profit', 'quarterly'));
console.log(getValueFromJson(json, 'profit', 'annual'));
console.log(getValueFromJson(json, 'revenue', 'quarterly'));
console.log(getValueFromJson(json, 'revenue', 'annual'));

Над отпечатками кода:

> 1000
> 5000
> 2000
> 10000
0 голосов
/ 25 февраля 2019

Это основная идея, тогда, если вам нужно, очевидно, масштабировать, вам нужно сделать это лучше.

let output = '';

// Searches the desired index (refactor as needed)
const index = spalten.findIndex(obj => obj.name == "profit")

// Extract all the profits (if you dont need all just select the desired one)
daten.map(item => output += `<p>${item[1]} profit ${item[0]}: ${item[index]}</p>`)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...