कोणीय में वस्तुओं की तुलना करें


79

क्या कोणीय में दो वस्तु की "गहरी" तुलना करना संभव है? मैं क्या करना चाहूंगा प्रत्येक कुंजी / मूल्य जोड़ी की तुलना करना है। उदाहरण के लिए:

वस्तु १

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

वस्तु २

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

तुलना करने के लिए मुझे जो कुछ भी चाहिए वह असफल है क्योंकि कुंजी / मूल्य जोड़े में से केवल एक ही अंतर है। दूसरे शब्दों में, सभी कुंजी / मूल्य जोड़े बिल्कुल या किसी अन्य विफलता से मेल खाना चाहिए। क्या यह कुछ पहले से ही कोणीय में बनाया गया है। मुझे यकीन है कि मैं अपनी खुद की सेवा लिख ​​सकता हूं अगर मुझे वास्तव में जरूरत है, लेकिन मुझे उम्मीद थी कि यह पहले से ही बनाया गया था। कोणीय.सामान्य के समान।

जवाबों:


205

आप उपयोग कर सकते हैं दो वस्तुओं की तुलना करने के लिए:

angular.equals(obj1, obj2)

यह एक गहरी तुलना करता है और कुंजी के क्रम पर निर्भर नहीं करता है देखें AngularJS DOCS और थोड़ा डेमो

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
ध्यान दें कि कोणीय.सामान्य परीक्षण पहचान करते हैं, समानता नहीं । TL; DR:angular.equals( { id: "12" }, { id: 12 } ) // is false
bobjones

@bobjones कोणीय. असमानता पहचान या गहरी समानता के आधार पर सही होती है, इसलिए आपका प्रस्तावित उदाहरण सही होगा। कोणीय असमान दस्तावेज देखें , विशेष रूप से दो वस्तुओं या मूल्यों को समान माना जाता है यदि निम्न में से कम से कम एक सत्य है
tommyTheHitMan

5
@tommyTheHitMan: bobjones उदाहरण देता है falseक्योंकि, पहचान के आधार पर "12"===12 // is false,। बस इसे आज़माएं।
klode

और अगर आपको रोलबैक के लिए इतिहास पर नज़र रखने के लिए एक अलग वस्तु की आवश्यकता है, तो इसे देखें ... gist.github.com/katowulf/6193808
मार्क

4
एक त्वरित टिप्पणी: angular.equals () $ से शुरू होने वाली सभी संपत्तियों की उपेक्षा करता है, और सभी गुण जिनके मूल्य कार्य हैं, जब दोनों तर्क ऑब्जेक्ट होते हैं।
im1dermike

24

यह मानते हुए कि दोनों वस्तुओं में क्रम समान है, बस stringifyवे दोनों और तुलना करते हैं!

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

14
angular.equals (obj1, obj2) को भी काम करना चाहिए। यह कुंजी क्रम से निर्भर नहीं करता है और यह गहरा है (इसे पुनरावर्ती कहा जाता है) code.angularjs.org/1.2.0/docs/api/angular.equals
klode

4
यह एक बहुत बुरा अनुमान होगा!
होलोग्राफिक-सिद्धांत

1
angular.toJson$ $ hashKeys को भी हटा देगा

5

इस धागे पर थोड़ा देर से। angular.equals गहरी जाँच करता है, हालाँकि क्या किसी को पता है कि इसके सदस्य के उपसर्ग में "$" होने पर इसका व्यवहार अलग-अलग क्यों होता है?

आप निम्नलिखित इनपुट के साथ इस डेमो की कोशिश कर सकते हैं

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
कोणीय प्रलेखन से: "एक संपत्ति तुलना के दौरान, फ़ंक्शन प्रकार के गुण और नाम के साथ गुण जो $ से शुरू होते हैं, उन्हें अनदेखा किया जाता है।" docs.angularjs.org/api/ng/function/angular.equals
ध्वनिविद्या

2

मुझे पता है कि यह थोड़े देर से जवाब है, लेकिन मैं इसके बारे में आधे घंटे के डिबगिंग के कारण खो गया, यह किसी को कुछ समय बचा सकता है।

ध्यान रखें, यदि आप उन angular.equals()वस्तुओं पर उपयोग करते हैं, जिनके पास संपत्ति है obj.$something (संपत्ति का नाम $ से शुरू होता है) तो उन गुणों की तुलना में अनदेखी हो जाएगी।

उदाहरण:

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)
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.