So sánh các đối tượng trong Angular


79

Có thể thực hiện so sánh "sâu" hai đối tượng trong Angular không? Những gì tôi muốn làm là so sánh từng cặp khóa / giá trị. Ví dụ:

Đối tượng 1

{
   key1: "value1",
   key2: "value2",
   key3: "value3"
}

Đối tượng 2

{
   key1: "value1",
   key2: "newvalue",
   key3: "value3" 
}

Điều tôi cần là so sánh không thành công vì chỉ một trong các cặp khóa / giá trị là khác nhau. Nói cách khác, TẤT CẢ các cặp khóa / giá trị phải khớp chính xác nếu không sẽ thất bại. Đây có phải là thứ đã được tích hợp sẵn trong Angular. Tôi chắc rằng tôi có thể viết dịch vụ của riêng mình nếu tôi thực sự cần, nhưng tôi hy vọng nó đã được tích hợp sẵn. Tương tự như angle.equals.

Câu trả lời:


205

Để so sánh hai đối tượng, bạn có thể sử dụng:

angular.equals(obj1, obj2)

Nó so sánh sâu và không phụ thuộc vào thứ tự của các phím Xem AngularJS DOCS và một chút Demo

var obj1 = {
  key1: "value1",
  key2: "value2",
  key3: {a: "aa", b: "bb"}
}

var obj2 = {
  key2: "value2",
  key1: "value1",
  key3: {a: "aa", b: "bb"}
}

angular.equals(obj1, obj2) //<--- would return true

6
Lưu ý rằng angle.equals kiểm tra tính đồng nhất, không phải bình đẳng . TL; DR:angular.equals( { id: "12" }, { id: 12 } ) // is false
bobjones

@bobjones angle.equals trả về true dựa trên danh tính HOẶC bình đẳng sâu, vì vậy ví dụ được đề xuất của bạn sẽ trả về true. xem các tài liệu angular.equals , đặc biệt là hai đối tượng hoặc giá trị được coi là tương đương nếu ít nhất một trong những điều sau đây là đúng
tommyTheHitMan

5
@tommyTheHitMan: Ví dụ bobjones trả về falsebởi vì, dựa trên danh tính "12"===12 // is false,. Chỉ cần thử nó ra.
klode,

Và nếu bạn cần một đối tượng khác để theo dõi lịch sử cho quá trình khôi phục, hãy xem phần này ... gist.github.com/katowulf/6193808
Đánh dấu

4
Lưu ý nhanh: angle.equals () bỏ qua tất cả các thuộc tính bắt đầu bằng $ và tất cả các thuộc tính có giá trị là hàm, khi cả hai đối số đều là đối tượng.
im1dermike

24

Giả sử rằng thứ tự giống nhau ở cả hai đối tượng, hãy chỉ stringifycả hai và so sánh!

JSON.stringify(obj1) == JSON.stringify(obj2);

14
angle.equals (obj1, obj2) cũng sẽ hoạt động. Nó không phụ thuộc vào thứ tự khóa và nó sâu (nó được gọi là đệ quy) code.angularjs.org/1.2.0/docs/api/angular.equals
klode

4
Đó sẽ là một giả định rất tệ!
hologram-nguyên tắc

1
angular.toJsoncũng sẽ xóa $$ hashKeys

5

Hơi trễ trên chủ đề này. angle.equals không kiểm tra sâu, tuy nhiên có ai biết rằng tại sao nó hoạt động khác nếu một trong các thành viên chứa "$" ở tiền tố không?

Bạn có thể thử Demo này với đầu vào sau

var obj3 = {}
obj3.a=  "b";
obj3.b={};
obj3.b.$c =true;

var obj4 = {}
obj4.a=  "b";
obj4.b={};
obj4.b.$c =true;

angular.equals(obj3,obj4);

4
Từ tài liệu Angular: "Trong khi so sánh thuộc tính, các thuộc tính của kiểu hàm và thuộc tính có tên bắt đầu bằng $ sẽ bị bỏ qua." docs.angularjs.org/api/ng/osystem/angular.equals
sonicwizard,

2

Tôi biết đó là một câu trả lời muộn nhưng tôi chỉ mất khoảng nửa giờ để gỡ lỗi nguyên nhân của việc này, Nó có thể giúp ai đó tiết kiệm thời gian.

Hãy lưu tâm, nếu bạn sử dụng angular.equals()trên các đối tượng có thuộc tính obj.$something (tên thuộc tính bắt đầu bằng $) thì các thuộc tính đó sẽ bị bỏ qua khi so sánh.

Thí dụ:

var obj1 = {
  $key0: "A",
  key1: "value1",
  key2: "value2",
  key3: {a: "aa", b: "bb"}
}

var obj2 = {
  $key0: "B"
  key2: "value2",
  key1: "value1",
  key3: {a: "aa", b: "bb"}
}

angular.equals(obj1, obj2) //<--- would return TRUE (despite it's not true)
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.