Saya memiliki beberapa kode yang terstruktur seperti ini tetapi dengan banyak variabel dengan jalur berbagai kedalaman di dalam dict yang mungkin ada atau mungkin tidak ada:

var dict = {
  'test1': 'test',
  'test2': ['testa', 'testb'],
}

var test_path1 = dict['test2']['testa'] ? test_path1: false
var test_path2 = dict['test3']['testz'] ? test_path2: false

console.log(test_path2)

Pada dasarnya program saya membuat banyak array yang disimpannya di dalam user_dict tergantung pada input pengguna. Kemudian saya perlu memproses dict dan memeriksa beberapa variabel untuk melihat nilainya, atau apakah ada atau tidak.

Saya bahkan tidak bisa sampai ke titik itu, karena mendefinisikan test_path2 mengembalikan "tidak dapat membaca properti testz dari undefined."

Saya pikir menggunakan? test_path2: false akan berfungsi, tetapi saya masih mendapatkan kesalahan yang sama.

Seseorang menyarankan untuk menggunakan rantai opsional, tetapi itu sepertinya bukan solusi yang baik karena beberapa variabel saya terletak di dalam 4-5 objek/array bersarang, yang masing-masing mungkin ada atau tidak ada.

Apa cara terbaik untuk menangani ini? Apakah ada kesalahan dengan sintaks saya atau apakah saya mendekati masalah dengan cara yang salah? Yang saya butuhkan hanyalah test_path1 dan test_path2 untuk mengembalikan false jika tidak ada.

0
TheNomadicAspie 5 Juli 2021, 01:59

4 jawaban

Jawaban Terbaik

Anda dapat menggunakan beberapa fitur javascript modern. Coba Rantai Opsional:

var dict = {
  'test1': 'test',
  'test2': { 'testa': 'testb' },
}

var test_path1 = dict['test2']?.['testa'] || false
var test_path2 = dict['test3']?.['testz'] || false

console.log(test_path1, test_path2)
1
Technobulka 4 Juli 2021, 23:08

Jika Anda ingin menulis kode yang lebih optimis, Anda juga bisa menggunakan try catch di beberapa titik dalam kode.

try {
  return dict.test1.test2
} catch (e) {
  if (e instanceof TypeError)
    return false

  throw e
}

Ini mencegah kebutuhan untuk menulis kode yang melakukan pemeriksaan nol.

0
bas080 4 Juli 2021, 23:24

https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/Optional_chaining

Rantai opsional dapat dan akan bekerja bahkan pada objek bersarang yang dalam

Untuk melengkapinya, Anda dapat menggunakan penggabungan nullish untuk mengembalikan "default" (fale dalam kasus Anda)

var test_path1 = dict['test2']?.['testa'] ?? false

Ini akan mengembalikan nilai atau salah jika tidak terdefinisi

1
Noriller 4 Juli 2021, 23:29

Bisa dibilang, cara terbaik untuk menangani ini (sambil menjaga kompatibilitas lama) menggunakan get dari lodash:

import { get } from 'lodash';
const result = get(dict, ['test2', 'testa']) || false;
// or
const result = get(dict, 'test2.testa') || false;

Catatan: untuk hanya mengimpor get (dan tidak ada yang lain) dari lodash, gunakan lodash-es alih-alih lodash. Dengan kata lain, dengan menggunakan lodash-es Anda mengaktifkan tree-shaking lodash pada langkah build.

Atau Anda cukup memeriksa setiap level:

const result = dict && dict.test2 && dict.test2.testa || false;

Jika kompatibilitas lama tidak menjadi masalah, Anda dapat menggunakan rangkaian opsional, seperti yang disarankan dalam jawaban Noriller.

1
tao 4 Juli 2021, 23:25