2016-08-31 1 views
3

Я имею в виду, есть ли разница в производительности? Какой из них способен сделать лучшее глубокое сравнение? Иногда угловая функция равенства не может найти разницы.В чем разница между angular.equals и _.isEqual?

Я также заметил, что угловая версия этой функции не проверяет ключ «$$ hashKey».

ответ

3

Они в основном действуют одинаково, сравнивая сами значения и все внутренние свойства. Производительность также близка к тому, чтобы быть одинаковой, по крайней мере, это будет разница в 100-200 мс для 10000 элементов. Я создал небольшой набор тестов, предупреждение: ваша страница браузера замерзнет в течение нескольких секунд, когда вы запустите фрагмент кода. Я не совсем уверен, что это правильный способ измерения производительности, поэтому не стесняйтесь предлагать лучшие способы.

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

О, я не заметил вашего последнего обновления. В этом случае правильно использовать 'угловые.equals', потому что' underscore.isEqual' не будет сравнивать '$$ hashkey'. Или вы можете использовать функцию 'angular.toJson' для удаления внутренних элементов, таких как' $$ hashkey'. –

+0

. Вы ушли вниз, прежде чем обновлять свой вопрос, вероятно, потому, что люди читают ваш вопрос, как '_.isEqual vs angular.equals 'как вы можете видеть из ответа @ Ashokreddy, но также возник вопрос о производительности. Попытайтесь указать наиболее важные вещи, прежде всего, чтобы предотвратить downvotes. –

0

угловой.равнения: это угловое равное сравнение.

_.isEqual: это подчеркнутая равная функциональность. Перед использованием этого нужно импортировать символ подчеркивания.

 Смежные вопросы

  • Нет связанных вопросов^_^