Đây là phương pháp của tôi để tìm kiếm trong JSON lồng nhau, bạn có thể chia sẻ phương pháp của mình bằng cách trả lời bài viết này. Tôi sẽ chia sẻ luồng ở đây và cả phần lập trình
Ảnh của Mulyadi trên Bapt
Mã nguồn
Đôi khi, tôi cần xử lý một số thao tác hơi phức tạp trên một đối tượng JSON
Ví dụ: chúng tôi có một đối tượng JSON được gọi là nhân viên. Tôi muốn biết bộ phận của Mary là gì, có nghĩa là tôi muốn lấy chìa khóa “kế toán”
{"accounting" : [{ "firstName" : "John","lastName" : "Doe","age" : 23 },{ "firstName" : "Mary","lastName" : "Smith","age" : 32 }],"sales" : [{ "firstName" : "Sally","lastName" : "Green","age" : 27 },{ "firstName" : "Jim","lastName" : "Galley","age" : 41 }]}
Trong bài viết này, tôi sẽ không thực hiện nhiều kiểm tra và chỉ muốn chia sẻ quy trình
Bước đầu tiên tôi làm là làm phẳng đối tượng JSON này, sau đó tôi muốn lấy khóa của “Mary”. Lần này chìa khóa là “kế toán. 1. họ". Sau đó, tôi sẽ chia chuỗi này bằng cách “. ”, sau đó nhận được từ đầu tiên, đó là “kế toán”
{
'accounting.0.firstName': 'John',
'accounting.0.lastName': 'Doe',
'accounting.0.age': 23,
'accounting.1.firstName': 'Mary',
'accounting.1.lastName': 'Smith',
'accounting.1.age': 32,
'sales.0.firstName': 'Sally',
'sales.0.lastName': 'Green',
'sales.0.age': 27,
'sales.1.firstName': 'Jim',
'sales.1.lastName': 'Galley',
'sales.1.age': 41
}
phần lập trình
Tạo một thư mục có tên bất cứ thứ gì bạn muốn, chẳng hạn như “flatten_employees”. Tạo một chỉ mục. js tại thư mục gốc
Đi đến thiết bị đầu cuối và gõ
npm init --y
Cài đặt gói phẳng để làm phẳng JSON sau này
npm i flat
Chuyển đến chỉ mục. js
import flatten from "flat"const employees = {"accounting" : [{ "firstName" : "John","lastName" : "Doe","age" : 23 },{ "firstName" : "Mary","lastName" : "Smith","age" : 32 }],"sales" : [{ "firstName" : "Sally","lastName" : "Green","age" : 27 },{ "firstName" : "Jim","lastName" : "Galley","age" : 41 }]}const flatten_employees = flatten[employees];const name = "Mary"const found = Object.keys[flatten_employees].find[key=>flatten_employees[key]===name];const team = found.split[".",1];console.log[`${name} is from ${team} team` ]
Trong trường hợp này, chúng tôi đã sử dụng flatten_employees để lưu trữ JSON được làm phẳng
Ví dụ, nếu chúng ta muốn biết Mary ở khoa nào, chúng ta đặt tên là “Mary”
Sau đó, chúng tôi sử dụng đối tượng. keys để tìm khóa nào có giá trị bằng Mary
Chúng tôi lấy khóa accounting.1.firstName
và lưu trữ nó trong hằng số “đã tìm thấy
Sau đó, chúng tôi chia phần này bằng cách lấy .
làm dấu phân cách. Và chỉ cần lấy từ đầu tiên và lưu nó dưới dạng “đội” không đổi
Trả về một bản sao của một đối tượng có các giá trị không phải boolean giống như boolean, e. g. 'có', 'không', 'ok', 1, được chuyển đổi thành boolean. Sử dụng danh sách trắng lồng nhau gồm các khóa được chỉ định để chuyển đổi để giới hạn chuyển đổi thành boolean đối với các khóa đó
Hãy chú ý đến việc lồng các hàm đệ quy quá nhiều cấp. Mặc dù có khả năng giải quyết nhiều vấn đề, nhưng việc lồng nhau nổi tiếng là khó hiểu trong nháy mắt. Để tránh nhầm lẫn, hãy chú ý đến nơi các hàm đệ quy có thể được rút ra khỏi vị trí lồng nhau của chúng mà không tốn chi phí thời gian chạy đáng kể và làm như vậy bất cứ khi nào có thể. Nếu bạn có hơn 3 cấp hàm lồng nhau, rất có thể các nhà phát triển đồng nghiệp của bạn sẽ gặp khó khăn khi theo dõi nó
Để kiểm tra xem một đối tượng có thuộc tính lồng nhau hay không, hãy sử dụng toán tử xâu chuỗi tùy chọn - ?.
. Toán tử ?.
cho phép bạn đọc giá trị của thuộc tính lồng nhau mà không đưa ra lỗi nếu thuộc tính không tồn tại trên đối tượng, e. g. obj?.a?.b
Trong đoạn mã, chúng tôi sử dụng toán tử xâu chuỗi tùy chọn để kiểm tra xem một thuộc tính lồng nhau có tồn tại trên đối tượng hay không
Sử dụng toán tử ?.
tương tự như truy cập một thuộc tính trên một đối tượng có ký hiệu .
[dấu chấm], tuy nhiên, ?.
không đưa ra lỗi khi thuộc tính lồng nhau không tồn tại
Thay vào đó, nếu thuộc tính của đối tượng không tồn tại, toán tử ?.
trả về
{
'accounting.0.firstName': 'John',
'accounting.0.lastName': 'Doe',
'accounting.0.age': 23,
'accounting.1.firstName': 'Mary',
'accounting.1.lastName': 'Smith',
'accounting.1.age': 32,
'sales.0.firstName': 'Sally',
'sales.0.lastName': 'Green',
'sales.0.age': 27,
'sales.1.firstName': 'Jim',
'sales.1.lastName': 'Galley',
'sales.1.age': 41
}
4Trong đoạn mã, chúng tôi sử dụng toán tử ?.
để truy cập thuộc tính lồng nhau không tồn tại trên đối tượng
Khi toán tử ?.
cố gắng truy cập thuộc tính ?.
0 của đối tượng, nó nhận được
{
'accounting.0.firstName': 'John',
'accounting.0.lastName': 'Doe',
'accounting.0.age': 23,
'accounting.1.firstName': 'Mary',
'accounting.1.lastName': 'Smith',
'accounting.1.age': 32,
'sales.0.firstName': 'Sally',
'sales.0.lastName': 'Green',
'sales.0.age': 27,
'sales.1.firstName': 'Jim',
'sales.1.lastName': 'Galley',
'sales.1.age': 41
}
4 và đoản mạch trả về {
'accounting.0.firstName': 'John',
'accounting.0.lastName': 'Doe',
'accounting.0.age': 23,
'accounting.1.firstName': 'Mary',
'accounting.1.lastName': 'Smith',
'accounting.1.age': 32,
'sales.0.firstName': 'Sally',
'sales.0.lastName': 'Green',
'sales.0.age': 27,
'sales.1.firstName': 'Jim',
'sales.1.lastName': 'Galley',
'sales.1.age': 41
}
4Nếu bạn bỏ qua toán tử ?.
và chỉ sử dụng ký hiệu .
[dấu chấm], bạn sẽ gặp lỗi - "Không thể đọc thuộc tính ?.
5 của không xác định"
Lưu ý rằng ?.
không được hỗ trợ trong Internet Explorer, nếu bạn cần hỗ trợ trình duyệt, bạn có thể thêm ?.
7 cho nó, sử dụng ?.
8 để biên dịch mã của bạn thành phiên bản JavaScript cũ hơn hoặc sử dụng phương pháp tiếp theo được đề cập trong bài viết này
Một cách tiếp cận khác là kiểm tra thủ công xem một thuộc tính có tồn tại trên một đối tượng hay không
Trong đoạn mã, chúng tôi kiểm tra thủ công sự tồn tại của thuộc tính lồng nhau
Chúng tôi sử dụng toán tử ?.
9 [và], có nghĩa là các điều kiện trong câu lệnh obj?.a?.b
0 của chúng tôi sẽ được kiểm tra từ trái sang phải, từng cái một
Nếu bất kỳ điều kiện nào đánh giá thành giá trị sai, khối obj?.a?.b
0 sẽ không chạy
Điều này rất rõ ràng và kém thanh lịch hơn toán tử ?.
, tuy nhiên nó được hỗ trợ trong Internet Explorer
Trong ví dụ trên, chúng tôi kiểm tra rõ ràng xem mỗi thuộc tính có bằng
{
'accounting.0.firstName': 'John',
'accounting.0.lastName': 'Doe',
'accounting.0.age': 23,
'accounting.1.firstName': 'Mary',
'accounting.1.lastName': 'Smith',
'accounting.1.age': 32,
'sales.0.firstName': 'Sally',
'sales.0.lastName': 'Green',
'sales.0.age': 27,
'sales.1.firstName': 'Jim',
'sales.1.lastName': 'Galley',
'sales.1.age': 41
}
4 không. Bạn có thể xem các ví dụ chỉ sử dụng toán tử ?.
9, tuy nhiên cách tiếp cận này dễ bị lỗiVí dụ sau kiểm tra xem giá trị thuộc tính của đối tượng có trung thực không
Giá trị trung thực trong JavaScript là tất cả các giá trị không sai. Giá trị giả là. obj?.a?.b
5, obj?.a?.b
6, obj?.a?.b
7, obj?.a?.b
8,
{
'accounting.0.firstName': 'John',
'accounting.0.lastName': 'Doe',
'accounting.0.age': 23,
'accounting.1.firstName': 'Mary',
'accounting.1.lastName': 'Smith',
'accounting.1.age': 32,
'sales.0.firstName': 'Sally',
'sales.0.lastName': 'Green',
'sales.0.age': 27,
'sales.1.firstName': 'Jim',
'sales.1.lastName': 'Galley',
'sales.1.age': 41
}
4, ?.
0Đừng viết mã như thế này
Trong đoạn mã, chúng tôi kiểm tra xem thuộc tính của một đối tượng có phải là ?.
1 hay không, điều này không đủ để chúng tôi xác định xem thuộc tính đó có tồn tại trên đối tượng hay không
Thuộc tính ?.
2 được đặt thành obj?.a?.b
6, là giá trị ?.
4, vì vậy mặc dù thuộc tính ?.
2 tồn tại trên đối tượng nhưng khối obj?.a?.b
0 không bao giờ chạy vì điều kiện không được đáp ứng