Đối tượng là các loại tham chiếu để bạn có thể chỉ sử dụng if (foobar === foo || foobar === bar || foobar === baz || foobar === pew) { //do something } 2 hoặc if (foobar === foo || foobar === bar || foobar === baz || foobar === pew) { //do something } 3 để so sánh 2 đối tượng. Một cách nhanh chóng để so sánh nếu 2 đối tượng có cùng giá trị khóa, là sử dụng if (foobar === foo || foobar === bar || foobar === baz || foobar === pew) { //do something } 4. Một cách khác là sử dụng chức năng lodash if (foobar === foo || foobar === bar || foobar === baz || foobar === pew) { //do something } 5
# So sánh sâu thẳm
Yup, 2 cách cũng hoạt động cho các vật thể lồng sâu.
# Tôi nên sử dụng cái nào?
Điều đó phụ thuộc. Đối với if (foobar === foo || foobar === bar || foobar === baz || foobar === pew) { //do something } 6, thứ tự quan trọng. Vì vậy, nếu cặp giá trị khóa được đặt hàng khác nhau trong hai đối tượng nhưng giống nhau, nó sẽ trả về sai. Trong khi nó không quan trọng trong lodash if (foobar === foo || foobar === bar || foobar === baz || foobar === pew) { //do something } 5, nó sẽ trả về đúng khi cặp giá trị chính tồn tại.
Đây là đề xuất của tôi. Đối với một giải pháp nhanh chóng và bẩn, tôi sẽ sử dụng if (foobar === foo || foobar === bar || foobar === baz || foobar === pew) { //do something } 6. Nhưng đối với một giải pháp mạnh mẽ hơn bao gồm nhiều trường hợp cạnh kỳ lạ hơn, hãy sử dụng Lodash Way.
# Es6 cách để so sánh 2 đối tượng
Đây là một giải pháp được đề xuất bởi @mustafauzun0. Mặc dù vậy, rất ít điều cần lưu ý, nó đã giành được công việc với các đối tượng lồng nhau và thứ tự của các phím rất quan trọng. Ý tưởng đằng sau điều này tương tự như cách chuỗi. Nó bao phủ đối tượng thành một chuỗi và so sánh nếu các chuỗi là một kết quả phù hợp. Về cơ bản nó so sánh sự bình đẳng của hai chuỗi. Đó là lý do tại sao đơn đặt hàng quan trọng.
Cảm ơn: @mustafauzun0
# Json.Stringify vs hiệu suất của Lodash
Cole Turner: Đáng chú ý rằng các đối tượng không đảm bảo thứ tự sắp xếp và Stringify sẽ tốn nhiều hiệu suất hơn vì nó phải tuần tự hóa toàn bộ đối tượng trong khi Lodash có thể thoát ra sớm nếu tìm thấy một khóa không khớp. Điều này xuất hiện trong các cuộc phỏng vấn 🙂
Cảm ơn: @Coleturner
BLNKDOTSPACE: Lodash nhanh hơn đáng kể. Bởi vì Lodash sẽ bỏ cuộc ngay khi nó đạt đến sự khác biệt đầu tiên, nhưng Stringify đi ngay cho đến khi kết thúc một cách không cần thiết. Nếu bạn có các mảng nhỏ thì không sao nhưng đối với các trường hợp sử dụng cá nhân của tôi với hơn 1000 sự kiện/sản phẩm trong danh sách, tôi sẽ không bao giờ sử dụng Stringify.
Cảm ơn: @blnkdotspace
# Tài nguyên
- MDN Web Docs - JSON.Stringify
- Lodash: Isequal
- Hiểu các đối tượng JavaScript
- Bình đẳng đối tượng trong JavaScript
- JavaScript so sánh đối tượng sâu - JSON.
- Stack Overflow: Có tốt không khi sử dụng JSON.Stringify để so sánh sâu và nhân bản?
- Làm thế nào để xác định bình đẳng cho hai đối tượng JavaScript?
89
Mới! Lưu câu hỏi hoặc câu trả lời và sắp xếp nội dung yêu thích của bạn. Tìm hiểu thêm.
Learn more.
Cách đẹp nhất để so sánh một giá trị với các tùy chọn bội số là gì?
Tôi biết có rất nhiều cách để làm điều này, nhưng tôi đang tìm kiếm gọn gàng nhất.
Tôi hỏi bởi vì tôi hy vọng điều này là khả thi (nó không phải, rõ ràng là khi bạn nhìn vào nó):
if (foobar == (foo||bar) ) { //do something }
Isherwood
54,6K15 Huy hiệu vàng107 Huy hiệu bạc147 Huy hiệu đồng15 gold badges107 silver badges147 bronze badges
hỏi ngày 2 tháng 2 năm 2012 lúc 23:09Feb 2, 2012 at 23:09
Thelastshadowthelastshadowthelastshadow
3.2733 huy hiệu vàng34 Huy hiệu bạc35 Huy hiệu đồng3 gold badges34 silver badges35 bronze badges
3
Đừng cố gắng quá lén lút, đặc biệt là khi nó không cần thiết phải ảnh hưởng đến hiệu suất. Nếu bạn thực sự có cả đống so sánh để làm, chỉ cần định dạng nó một cách độc đáo.
if (foobar === foo || foobar === bar || foobar === baz || foobar === pew) { //do something }Đã trả lời ngày 2 tháng 2 năm 2012 lúc 23:35Feb 2, 2012 at 23:35
5
Những gì tôi sử dụng để làm, là đặt nhiều giá trị đó vào một mảng như
var options = [foo, bar];Và sau đó, sử dụng indexof ()
if(options.indexOf(foobar) > -1){ //do something }vì sự xinh đẹp:
if([foo, bar].indexOf(foobar) +1){ //you can't get any more pretty than this :) }và cho các trình duyệt cũ hơn: (//developer.mozilla.org/en/javascript/reference/global_objects/array/indexof)
( //developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Array/IndexOf )
Đã trả lời ngày 2 tháng 2 năm 2012 lúc 23:12Feb 2, 2012 at 23:12
7
Vì không có ai thêm giải pháp rõ ràng nhưng hoạt động tốt cho hai so sánh, tôi sẽ cung cấp nó:
if (foobar === foo || foobar === bar) { //do something }Và, nếu bạn có rất nhiều giá trị (có lẽ hàng trăm hoặc hàng ngàn), thì tôi khuyên bạn nên tạo ra một bộ vì điều này tạo ra mã so sánh rất sạch và đơn giản và nó nhanh trong thời gian chạy:
// pre-construct the Set var tSet = new Set(["foo", "bar", "test1", "test2", "test3", ...]); // test the Set at runtime if (tSet.has(foobar)) { // do something }Đối với Pre-ES6, bạn có thể nhận được một polyfill đã thiết lập trong đó có rất nhiều. Một được mô tả trong câu trả lời khác này.
Đã trả lời ngày 2 tháng 2 năm 2012 lúc 23:18Feb 2, 2012 at 23:18
jfriend00jfriend00jfriend00
655K91 Huy hiệu vàng931 Huy hiệu bạc933 Huy hiệu Đồng91 gold badges931 silver badges933 bronze badges
4
Bạn có thể sử dụng một công tắc:
switch (foobar) { case foo: case bar: // do something }Đã trả lời ngày 2 tháng 2 năm 2012 lúc 23:12Feb 2, 2012 at 23:12
Vì không có ai thêm giải pháp rõ ràng nhưng hoạt động tốt cho hai so sánh, tôi sẽ cung cấp nó:Guffa
Và, nếu bạn có rất nhiều giá trị (có lẽ hàng trăm hoặc hàng ngàn), thì tôi khuyên bạn nên tạo ra một bộ vì điều này tạo ra mã so sánh rất sạch và đơn giản và nó nhanh trong thời gian chạy:108 gold badges722 silver badges995 bronze badges
0
Đối với Pre-ES6, bạn có thể nhận được một polyfill đã thiết lập trong đó có rất nhiều. Một được mô tả trong câu trả lời khác này.
Đã trả lời ngày 2 tháng 2 năm 2012 lúc 23:18
if (~[foo, bar].indexOf(foobar)) { // pretty }655K91 Huy hiệu vàng931 Huy hiệu bạc933 Huy hiệu ĐồngFeb 13, 2013 at 10:27
Bạn có thể sử dụng một công tắc:lucideer
Guffaguffa24 silver badges31 bronze badges
1
674K108 Huy hiệu vàng722 Huy hiệu bạc995 Huy hiệu Đồng
if (foobar === foo || foobar === bar || foobar === baz || foobar === pew) { //do something } 0Chỉ dành cho những cú đá, vì câu hỏi và trả lời này dường như là về vi phân cú pháp, một sửa đổi nhỏ bé của gợi ý của André Alçada Padez:not work on IE < 9.
.Jun 7, 2013 at 8:54
Đã trả lời ngày 13 tháng 2 năm 2013 lúc 10:27Ionică Bizău
Lucideerlucideer82 gold badges274 silver badges456 bronze badges
2
3.79424 Huy hiệu bạc31 Huy hiệu đồng
David
17.4K4 Huy hiệu vàng42 Huy hiệu bạc57 Huy hiệu đồng4 gold badges42 silver badges57 bronze badges
Đã trả lời ngày 2 tháng 2 năm 2012 lúc 23:21Feb 2, 2012 at 23:21
JamieseejamieseeJamieSee
12.4K2 Huy hiệu vàng30 Huy hiệu bạc47 Huy hiệu đồng2 gold badges30 silver badges47 bronze badges
5
Phương pháp chuyển đổi (như được đề cập bởi Guffa) thực sự hoạt động rất độc đáo. Tuy nhiên, các cài đặt cảnh báo mặc định trong hầu hết các lin sẽ cảnh báo bạn về việc sử dụng giảm. Đó là một trong những lý do chính khiến tôi sử dụng các công tắc, vì vậy tôi đã bỏ qua cảnh báo này khá nhiều, nhưng bạn nên lưu ý rằng việc sử dụng tính năng rơi của câu lệnh Switch có thể là khó khăn. Mặc dù vậy, trong những trường hợp như thế này - tôi sẽ đi cho nó.
Đã trả lời ngày 25 tháng 2 năm 2014 lúc 11:43Feb 25, 2014 at 11:43
NinjatoolninjatoolNinjaTool
531 Huy hiệu bạc5 Huy hiệu đồng1 silver badge5 bronze badges
0
Tôi thích hình thức kiểm tra chỉ mục với một mảng, nhưng hãy lưu ý, điều này không hoạt động trong tất cả các trình duyệt (vì Array.Prototype.indexof không có trong IEXPLORER cũ).
Tuy nhiên, có một cách tương tự bằng cách sử dụng jQuery với hàm $ .Inarray ():
if (foobar === foo || foobar === bar || foobar === baz || foobar === pew) { //do something } 1Nó có thể tốt hơn, vì vậy bạn không nên kiểm tra nếu indexof tồn tại.
Hãy cẩn thận với so sánh (không sử dụng == true/false), vì $ .inArray trả về chỉ mục của vị trí phù hợp nơi giá trị đã được tìm thấy và nếu chỉ mục là 0, nó sẽ sai khi nó thực sự tồn tại thành Mảng.
Đã trả lời ngày 25 tháng 3 năm 2015 lúc 9:56Mar 25, 2015 at 9:56
1