Bạn đang gặp khó khăn khi xử lý các đối tượng JSON có cấu trúc phức tạp và chứa các khóa trùng lặp? Bài viết này sẽ cung cấp cho bạn một giải pháp JavaScript hiệu quả để hợp nhất các đối tượng JSON này một cách thông minh và đảm bảo tính toàn vẹn của dữ liệu. Chúng ta sẽ đi sâu vào các phương pháp khác nhau, từ đơn giản đến nâng cao, giúp bạn chọn được cách tiếp cận phù hợp nhất với nhu cầu của mình.
Trong quá trình phát triển ứng dụng web, việc xử lý dữ liệu JSON từ nhiều nguồn khác nhau là điều thường xuyên xảy ra. Đôi khi, bạn sẽ gặp phải tình huống các đối tượng JSON có cùng khóa, nhưng giá trị lại khác nhau. Việc hợp nhất các đối tượng này một cách thủ công có thể tốn thời gian và dễ gây ra lỗi.
Ví dụ, bạn có một mảng các đối tượng JSON như sau:
[
{
"meine_frage": "hier kommt die antwort",
"ne_andere_frage": "ne andere antwort",
"was_willst_du": "alles",
"mehr_zur_auswahl": ["einiges", "vieles und", "gär nix"]
},
{
"meine_frage": "tom & jerry",
"ne_andere_frage": "mickey maus",
"was_willst_du": "oder",
"mehr_zur_auswahl": ["manches", "einiges", "vieles und", "gär nix"]
},
{
"meine_frage": "dick und doof",
"ne_andere_frage": "minnie muas",
"was_willst_du": "nichts",
"mehr_zur_auswahl": ["gär nix"]
}
]
Mục tiêu là hợp nhất các đối tượng này thành một đối tượng duy nhất, trong đó các giá trị của các khóa trùng lặp được gom lại thành một mảng. Kết quả mong muốn sẽ như sau:
[
{
"meine_frage": ["hier kommt die antwort", "tom & jerry", "dick und doof"],
"ne_andere_frage": ["ne andere antwort", "mickey maus", "minnie muas"],
"was_willst_du": ["alles", "oder", "nichts"],
"mehr_zur_auswahl": ["einiges", "vieles und", "gär nix", "manches", "einiges", "vieles und", "gär nix"]
}
]
reduce()
và concat()
Một trong những cách hiệu quả nhất để giải quyết vấn đề này là sử dụng phương thức reduce()
kết hợp với concat()
của JavaScript. Phương thức reduce()
cho phép bạn duyệt qua một mảng và tích lũy kết quả vào một giá trị duy nhất. Trong khi đó, concat()
dùng để nối các mảng hoặc giá trị lại với nhau.
Dưới đây là một ví dụ về cách sử dụng reduce()
và concat()
để hợp nhất các đối tượng JSON có cùng khóa:
const data = [
{
"meine_frage": "hier kommt die antwort",
"ne_andere_frage": "ne andere antwort",
"was_willst_du": "alles",
"mehr_zur_auswahl": ["einiges", "vieles und", "gär nix"]
},
{
"meine_frage": "tom & jerry",
"ne_andere_frage": "mickey maus",
"was_willst_du": "oder",
"mehr_zur_auswahl": ["manches", "einiges", "vieles und", "gär nix"]
},
{
"meine_frage": "dick und doof",
"ne_andere_frage": "minnie muas",
"was_willst_du": "nichts",
"mehr_zur_auswahl": ["gär nix"]
}
];
const result = data.reduce(function (r, e) {
Object.keys(e).forEach(function (k) {
if (!r[k]) r[k] = [].concat(e[k]);
else r[k] = r[k].concat(e[k]);
});
return r;
}, {});
console.log(result);
Đoạn code trên sẽ tạo ra một đối tượng JSON duy nhất chứa tất cả các khóa từ các đối tượng ban đầu, với giá trị là một mảng chứa tất cả các giá trị tương ứng.
{}
để làm giá trị ban đầu cho reduce()
.
Object.keys(e).forEach()
để duyệt qua từng khóa trong mỗi đối tượng JSON.
r
) hay chưa. Nếu chưa, khởi tạo một mảng mới chứa giá trị của khóa đó. Nếu đã tồn tại, nối giá trị hiện tại vào mảng đã có bằng concat()
.
r
đã được cập nhật cho vòng lặp tiếp theo của reduce()
.
Ngoài phương pháp sử dụng reduce()
và concat()
, còn có một số phương pháp khác để hợp nhất các đối tượng JSON có cùng khóa, ví dụ như sử dụng thư viện Lodash hoặc viết hàm tùy chỉnh. Tuy nhiên, phương pháp trên thường là đơn giản và hiệu quả nhất cho các trường hợp thông thường.
Việc hợp nhất các đối tượng JSON có cùng khóa là một tác vụ phổ biến trong phát triển web. Bằng cách sử dụng phương thức reduce()
và concat()
của JavaScript, bạn có thể dễ dàng giải quyết vấn đề này một cách hiệu quả. Hy vọng bài viết này đã cung cấp cho bạn những kiến thức hữu ích để xử lý dữ liệu JSON một cách chuyên nghiệp.
Bài viết liên quan