Đối với các danh sách lớn hơn, một cách hiệu quả hơn so với .indexOf
là đưa danh sách người dùng tốt của bạn vào một đối tượng và sử dụng tra cứu trực tiếp trên đối tượng đó. Điều này cũng hoạt động trong các trình duyệt cũ hơn vì nó không yêu cầu phương thức
if [goodUsers[user]]
0.var goodUsers = {
"someuser1": true,
"someuser2": true,
"someuser3": true
};
Sau đó, bạn có thể kiểm tra xem người dùng có nằm trong danh sách đó với không:
if [goodUsers[user]]
Đối với các danh sách dài hơn, điều này hiệu quả hơn rất nhiều so với việc sử dụng indexof, chỉ lặp đi lặp lại thông qua mảng so sánh từng mục trong mảng với mục tiêu của bạn vì điều này sử dụng tra cứu băm [như bảng băm].
Nếu bạn có một bộ người dùng ứng viên và bạn muốn biết những người nào trong danh sách
if [goodUsers[user]]
1, bạn có thể làm điều đó như thế này:var goodUsers = {
"someuser1": true,
"someuser2": true,
"someuser3": true
};
var candidateUsers = ["someuser4", "someuser1", "someuser5", "someuser2", "someuser6", "someuser3", "someuser7"];
function checkUsers[candidates] {
var goods = [];
for [var i = 0, len = candidates.length; i < len; i++] {
var item = candidates[i];
if [goodUsers[item]] {
goods.push[item];
}
}
return[goods];
}
var validUsers = checkUsers[candidateUsers];
Edit:
Mặc dù tìm kiếm đối tượng này vẫn hoạt động trong JavaScript hiện đại, nhưng hiện tại có một đối tượng
if [goodUsers[user]]
2 và if [goodUsers[user]]
3 trong ES6 có thể làm sạch hơn và hiệu quả hơn. Đối với tra cứu người dùng, có lẽ bạn sẽ sử dụng đối tượng if [goodUsers[user]]
2.const goodUsers = new Set[["someUser1", "someUser2", "someUser3"]];
goodUsers.add["someUser4"];
if [goodUsers.has[user]] {
// user is in the set
}
Bắt đầu nội dung chính
So sánh bình đẳng
So sánh hai mảng trong JavaScript bằng cách sử dụng các toán tử bình đẳng lỏng lẻo hoặc nghiêm ngặt [
if [goodUsers[user]]
5 hoặc if [goodUsers[user]]
6] thường sẽ dẫn đến if [goodUsers[user]]
7, ngay cả khi hai mảng chứa cùng một phần tử theo cùng một thứ tự. Điều này là do thực tế là các mảng và đối tượng được so sánh bằng tham chiếu chứ không phải bằng giá trị trong JavaScript, điều đó có nghĩa là giải pháp này không tạo ra kết quả mong muốn:const a = [1, 2, 3]; const b = [1, 2, 3]; a === b;
Json.Stringify
Một giải pháp phổ biến mà nhiều người đề xuất là sử dụng
if [goodUsers[user]]
8. Điều này cho phép chúng tôi tuần tự hóa từng mảng và sau đó so sánh hai chuỗi tuần tự hóa. Một triển khai đơn giản của điều này có thể trông giống như thế này:const equals = [a, b] => JSON.stringify[a] === JSON.stringify[b]; const a = [1, 2, 3]; const b = [1, 2, 3]; equals[a, b];
Mặc dù điều này có vẻ như là một giải pháp tuyệt vời, ngắn và dễ hiểu, nhưng nó bị thiếu một số trường hợp cạnh trong đó chuỗi tuần tự hóa của các giá trị khác nhau là như nhau. Ví dụ:
const str = 'a'; const strObj = new String['a']; str === strObj; equals[[str], [strObj]]; null === undefined; equals[[null], [undefined]];
Mặc dù những trường hợp này có vẻ khá hiếm, nhưng chúng có thể gây ra một số vấn đề rất khó chịu khó theo dõi và khắc phục. Đây là lý do tại sao giải pháp này không được khuyến nghị cho hầu hết các trường hợp sử dụng.
Một cách tốt hơn
Một cách tiếp cận tốt hơn là so sánh hai mảng '
if [goodUsers[user]]
9 và sử dụng var goodUsers = {
"someuser1": true,
"someuser2": true,
"someuser3": true
};
var candidateUsers = ["someuser4", "someuser1", "someuser5", "someuser2", "someuser6", "someuser3", "someuser7"];
function checkUsers[candidates] {
var goods = [];
for [var i = 0, len = candidates.length; i < len; i++] {
var item = candidates[i];
if [goodUsers[item]] {
goods.push[item];
}
}
return[goods];
}
var validUsers = checkUsers[candidateUsers];
0 để so sánh các giá trị của hai mảng:const equals = [a, b] => a.length === b.length && a.every[[v, i] => v === b[i]]; const a = [1, 2, 3]; const b = [1, 2, 3]; const str = 'a'; const strObj = new String['a']; equals[a, b]; equals[[str], [strObj]]; equals[[null], [undefined]];
Cách tiếp cận này bảo vệ chống lại vấn đề tuần tự hóa được mô tả ở trên. Tuy nhiên, nó không tính đến các mảng hoặc đối tượng lồng nhau, cần được kiểm tra đệ quy. Đối với một giải pháp mạnh mẽ xử lý vấn đề này và các vấn đề khác, bạn nên sử dụng đoạn trích bằng nhau.
So sánh không có thứ tự
Cuối cùng, có những trường hợp thứ tự của các phần tử trong mỗi mảng không quan trọng và chúng tôi chỉ quan tâm đến cùng một giá trị tồn tại trong cả hai mảng. Đối với những trường hợp này, bạn có thể sử dụng
if [goodUsers[user]]
2 và var goodUsers = {
"someuser1": true,
"someuser2": true,
"someuser3": true
};
var candidateUsers = ["someuser4", "someuser1", "someuser5", "someuser2", "someuser6", "someuser3", "someuser7"];
function checkUsers[candidates] {
var goods = [];
for [var i = 0, len = candidates.length; i < len; i++] {
var item = candidates[i];
if [goodUsers[item]] {
goods.push[item];
}
}
return[goods];
}
var validUsers = checkUsers[candidateUsers];
2 kết hợp với một vòng lặp để lặp qua các giá trị duy nhất và kiểm tra xem mỗi cái có cùng số lần trong mỗi mảng không:const equalsIgnoreOrder = [a, b] => { if [a.length !== b.length] return false; const uniqueValues = new Set[[...a, ...b]]; for [const v of uniqueValues] { const aCount = a.filter[e => e === v].length; const bCount = b.filter[e => e === v].length; if [aCount !== bCount] return false; } return true; }
Để giải thích chi tiết hơn, bạn nên kiểm tra đoạn trích Havesamecontents.
Đoạn trích và bộ sưu tập được đề xuất
So sánh các giá trị trong JavaScript là một trong những nhiệm vụ phổ biến nhất, nhưng nó có rất nhiều điều bạn nên ghi nhớ.
Trả về sự khác biệt đối xứng giữa hai mảng, sử dụng một hàm được cung cấp làm bộ so sánh.
Trả về mọi yếu tố tồn tại trong bất kỳ một trong hai mảng ít nhất một lần, sử dụng hàm so sánh được cung cấp.
Tìm hiểu làm thế nào bạn có thể so sánh hai đối tượng trong JavaScript bằng các kỹ thuật khác nhau khác nhau.