Misalkan saya memiliki beberapa JSON seperti di bawah ini:

[
  {
    "date": "2020-12-25",
    "total_cases": 469482.0,
    "new_cases": 2260.0,
    "new_cases_smoothed": 2115.571,
    "total_deaths": 9816.0,
    "new_deaths": 63.0,
    "new_deaths_smoothed": 80.857,
    "total_cases_per_million": 2125.388,
    "new_cases_per_million": 10.231,
    "new_cases_smoothed_per_million": 9.577,
    "total_deaths_per_million": 44.438,
    "new_deaths_per_million": 0.285,
    "new_deaths_smoothed_per_million": 0.366,
    "new_tests": 54649.0,
    "total_tests": 6482889.0,
    "total_tests_per_thousand": 29.349,
    "new_tests_per_thousand": 0.247,
    "new_tests_smoothed": 38118.0,
    "new_tests_smoothed_per_thousand": 0.173,
    "positive_rate": 0.056,
    "tests_per_case": 18.0,
    "tests_units": "tests performed"
  },
  {
    "date": "2020-12-26",
    "total_cases": 471335.0,
    "new_cases": 1853.0,
    "new_cases_smoothed": 2006.714,
    "total_deaths": 9874.0,
    "new_deaths": 58.0,
    "new_deaths_smoothed": 77.714,
    "total_cases_per_million": 2133.777,
    "new_cases_per_million": 8.389,
    "new_cases_smoothed_per_million": 9.085,
    "total_deaths_per_million": 44.701,
    "new_deaths_per_million": 0.263,
    "new_deaths_smoothed_per_million": 0.352,
    "new_tests": 40953.0,
    "total_tests": 6523842.0,
    "total_tests_per_thousand": 29.534,
    "new_tests_per_thousand": 0.185,
    "new_tests_smoothed": 37101.0,
    "new_tests_smoothed_per_thousand": 0.168,
    "positive_rate": 0.054,
    "tests_per_case": 18.5,
    "tests_units": "tests performed"
  },
  {
    "date": "2020-12-27",
    "total_cases": 473309.0,
    "new_cases": 1974.0,
    "new_cases_smoothed": 2048.714,
    "total_deaths": 9929.0,
    "new_deaths": 55.0,
    "new_deaths_smoothed": 76.714,
    "total_cases_per_million": 2142.714,
    "new_cases_per_million": 8.936,
    "new_cases_smoothed_per_million": 9.275,
    "total_deaths_per_million": 44.95,
    "new_deaths_per_million": 0.249,
    "new_deaths_smoothed_per_million": 0.347,
    "new_tests": 33270.0,
    "total_tests": 6557112.0,
    "total_tests_per_thousand": 29.685,
    "new_tests_per_thousand": 0.151,
    "new_tests_smoothed": 36539.0,
    "new_tests_smoothed_per_thousand": 0.165,
    "positive_rate": 0.056,
    "tests_per_case": 17.8,
    "tests_units": "tests performed"
  },
  {
    "date": "2020-12-28",
    "new_tests": 32205.0,
    "total_tests": 6589317.0,
    "total_tests_per_thousand": 29.83,
    "new_tests_per_thousand": 0.146,
    "new_tests_smoothed": 36172.0,
    "new_tests_smoothed_per_thousand": 0.164,
    "tests_units": "tests performed"
  }
]

Dari larik catatan di JSON ini, saya ingin mengambil contoh terbaru dari "total_cases". Inilah JavaScript yang saya tulis untuk memenuhi ini:

const total_cases = (data[data.length - 1].total_cases);

Jelas, ini tidak berhasil, karena catatan terakhir dalam larik tidak berisi turunan dari kunci "total_cases". Saya mengambil dari sumber menggunakan HTTP GET, dan diperbarui setiap hari, jadi terkadang catatan terbaru memiliki kunci yang saya cari, tetapi di lain waktu saya mendapatkan TypeError.

Pertanyaan saya adalah apakah ada cara untuk menemukan indeks catatan terbaru yang memiliki kunci tertentu yang saya cari, ketika JSON memiliki beberapa inkonsistensi seperti ini. Alternatifnya adalah mengatakan persetan dengan itu dan mencari sumber lain. Saya sedang mempertimbangkan opsi itu, karena ini terlalu merepotkan untuk dikerjakan, tetapi saya masih penasaran dengan apa yang bisa dilakukan. Harapan itu masuk akal.

2
Haz-ctrl 29 Desember 2020, 16:58

3 jawaban

Jawaban Terbaik

Anda bisa membalikkan array dan kemudian menggunakan metode Array.find.

const total_cases = data
  .slice() // Since reverse() changes the array in place, we need a copy of the original array
  .reverse()
  .find(record => record.total_cases !== undefined)
  .total_cases;
3
Mark Skelton 29 Desember 2020, 14:06

Cara yang mungkin untuk melakukannya adalah dengan membalikkan array dan kemudian menggunakan Array.prototype.find() untuk mencari catatan terbaru dengan total kasus.

data.reverse().find(r => r.total_cases);
1
Sai 29 Desember 2020, 14:11

Anda dapat melakukan sesuatu seperti ini, yang menurut saya mudah dipahami untuk Anda dan untuk pengembang berikutnya yang membaca kode Anda

data
  .sort((i1, i2) => i1.date > i2.date ? -1 : 1)
  .filter(item => Boolean(item.total_cases))
  [0].total_cases
0
arnaudambro 29 Desember 2020, 14:17