2016-08-31 3 views

답변

3

기본적으로 값 자체와 모든 내부 속성을 비교하여 동일하게 작동합니다. 성능도 거의 동일합니다. 적어도 10000 개의 요소에 대해 100-200 ms의 차이가 있습니다. 작은 테스트 스위트를 만들었습니다. 경고 : 코드 스 니펫을 실행할 때 브라우저 페이지가 몇 초 동결됩니다. 나는 성능을 측정하는 올바른 방법이 아니므로 더 나은 방법을 제안하는 것이 자유 롭다.

angular 
 
.module("comparsion", []) 
 
.controller("ComparsionCtrl", function($scope) { 
 
    var testCases = 10000; 
 
    
 
    console.time("underscore"); 
 
    for(var i = 0; i < testCases; i++) { 
 
    var obj = createRandomObj(5, true); 
 
    var obj1 = createRandomObj(5, true); 
 
    _.isEqual(obj, obj1); 
 
    } 
 
    console.timeEnd("underscore"); 
 
    
 
    console.time("angular"); 
 
    for(var i = 0; i < testCases; i++) { 
 
    var obj = createRandomObj(5, true); 
 
    var obj1 = createRandomObj(5, true); 
 
    angular.equals(obj, obj1); 
 
    } 
 
    console.timeEnd("angular"); 
 
    
 
    // Random object generator from http://stackoverflow.com/questions/2443901/random-object-generator-in-javascript 
 
    function createRandomObj(fieldCount, allowNested) 
 
{ 
 
    var generatedObj = {}; 
 

 
    for(var i = 0; i < fieldCount; i++) { 
 
     var generatedObjField; 
 

 
     switch(randomInt(allowNested ? 6 : 5)) { 
 

 
      case 0: 
 
      generatedObjField = randomInt(1000); 
 
      break; 
 

 
      case 1: 
 
      generatedObjField = Math.random(); 
 
      break; 
 

 
      case 2: 
 
      generatedObjField = Math.random() < 0.5 ? true : false; 
 
      break; 
 

 
      case 3: 
 
      generatedObjField = randomString(randomInt(4) + 4); 
 
      break; 
 

 
      case 4: 
 
      generatedObjField = null; 
 
      break; 
 

 
      case 5: 
 
      generatedObjField = createRandomObj(fieldCount, allowNested); 
 
      break; 
 
     } 
 
     generatedObj[randomString(8)] = generatedObjField; 
 
    } 
 
    return generatedObj; 
 
} 
 

 
// helper functions 
 

 
function randomInt(rightBound) 
 
{ 
 
    return Math.floor(Math.random() * rightBound); 
 
} 
 

 
function randomString(size) 
 
{ 
 
    var alphaChars = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ"; 
 
    var generatedString = ''; 
 
    for(var i = 0; i < size; i++) { 
 
     generatedString += alphaChars[randomInt(alphaChars.length)]; 
 
    } 
 

 
    return generatedString; 
 
} 
 
});
<script src="https://cdnjs.cloudflare.com/ajax/libs/underscore.js/1.8.3/underscore-min.js"></script> 
 
<script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.2.17/angular.min.js"></script> 
 
<div ng-app="comparsion"> 
 
    <div ng-controller="ComparsionCtrl"></div> 
 
</div>

+0

그리고 $$ hashkey이 나타나는 경우 어떤 일이 일어날까요? –

+1

오, 마지막 업데이트를 알지 못했습니다. 이 경우에는'unexderscore.isEqual'가'$$ hashkey' 비교를 실패하기 때문에 정확하게 'angular.equals'를 사용할 것입니다. 또는'angular.toJson' 함수를 사용하여'$$ hashkey'와 같은 내부 요소를 제거 할 수 있습니다. –

+0

질문을 업데이트하기 전에 downvoted가 발생했습니다. 사람들이'_.isEqual vs angular.equals '@ Ashokreddy의 대답에서 볼 수 있듯이 성능에 대한 질문도있었습니다. downvotes을 방지하기 위해 가장 중요한 것들을 먼저 지적하십시오. –

0

angular.equals : 이것은 angular equals 비교입니다.

_.isEqual : 이것은 밑줄과 같은 기능입니다.이 태그를 사용하려면 먼저 밑줄 j를 가져와야합니다.