Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #11 (permalink)  
Старый 21.07.2010, 11:30
Интересующийся
Отправить личное сообщение для Cepin Посмотреть профиль Найти все сообщения от Cepin
 
Регистрация: 07.03.2009
Сообщений: 21

Спасибо. Все гениальное просто) Благодарю.
Ответить с цитированием
  #12 (permalink)  
Старый 25.07.2010, 14:47
Профессор
Отправить личное сообщение для tenshi Посмотреть профиль Найти все сообщения от tenshi
 
Регистрация: 20.03.2008
Сообщений: 1,183

Object.prototype.valueOf= function(){ return JSON.stringify( this ) }

alert( {a:{b:2}} == {a:{b:2}} )
__________________
.ня
Ответить с цитированием
  #13 (permalink)  
Старый 17.06.2011, 19:25
Аватар для Ivan Galin
Новичок на форуме
Отправить личное сообщение для Ivan Galin Посмотреть профиль Найти все сообщения от Ivan Galin
 
Регистрация: 16.05.2011
Сообщений: 6

Метод конечно простой и удобный, но ...
var o1 = {a:1,b:2}, s1 = JSON.stringify(o1),
    o2 = {b:2,a:1}, s2 = JSON.stringify(o2);
console.log(s1 == s2);            //  false
console.log(s1);                  // {"a":1,"b":2}
console.log(s2);                  // {"b":2,"a":1}
Ответить с цитированием
  #14 (permalink)  
Старый 20.06.2011, 13:41
Профессор
Отправить личное сообщение для nikita.mmf Посмотреть профиль Найти все сообщения от nikita.mmf
 
Регистрация: 01.02.2010
Сообщений: 364

Object.equal = function( firstObj, secondObject ){
	var keysFirstObj = Object.keys( firstObj );
	var keysSecondObject = Object.keys( secondObject );
	if ( keysFirstObj.length != keysSecondObject.length ) {
		return false;
	}
	return !keysFirstObj.filter(function( key ){
		if ( typeof firstObj[key] == "object" ||  Array.isArray( firstObj[key] ) ) {
			return !Object.equal(firstObj[key], secondObject[key]);
		} else {
			return firstObj[key] !== secondObject[key];
		}
	}).length;
}
alert(Object.equal({a:[1,2,{b:1}], c: {d:[1,2,3]}},{a:[1,2,{b:1}], c: {d:[1,2,3]}}));

Последний раз редактировалось nikita.mmf, 20.06.2011 в 13:46.
Ответить с цитированием
  #15 (permalink)  
Старый 11.10.2012, 00:24
Интересующийся
Отправить личное сообщение для andrewinc Посмотреть профиль Найти все сообщения от andrewinc
 
Регистрация: 19.09.2012
Сообщений: 10

Немного доработал предыдущий вариант, если кому интересно.

/** сравнить объекты по значению рекурсивно все свойства.
 *@param Object firstObj один из объектов для сравнения
 *@param Object secondObject другой объект для сравнения
 *@return boolean true одинаковы, false - различаются
 *Пр.: Object.equals({a:[1,2,3],b:2}, {b:2,a:[1,2,3]}); //true
 *     Object.equals(null, null); //false
 *     Object.equals(1, 1); //true
 *     Object.equals(1, '1');//true
 *     Object.equals(1, {a:1});//false
 *     Object.equals([1,2], [1,2]);//true
 *     Object.equals(new Date(), new Date())//true
 *     
 *     var d= new Date();
 *     var d2= new Date(d.getTime()+3600000);
 *     Object.equals(d, d2); //false
 *     Object.equals(d, d); //true
 *     Object.equals(d, new Date(d.getTime())); //true
 **/
Object.equals = function( firstObj, secondObject ){
    if ((null==firstObj)||(null==secondObject)) return false; //null сравниваем правильно. Если хоть в одном операнде значит false
    if (('object'!=typeof firstObj) && ('object'!=typeof secondObject))  return firstObj==secondObject;//оба из простых - сравнение простых значений. 
    else if (('object'!=typeof firstObj) || ('object'!=typeof secondObject)) return false;//сравнивается простое значение с объектом - всегда не равны
    //в этой точке только если сравниваем именно объекты (оба)    
    
    //отдельно для дат
    if ((firstObj instanceof Date) && (secondObject instanceof Date)) return firstObj.getTime()==secondObject.getTime(); //исключение для дат. сравним их по микросекундам
    else if ((firstObj instanceof Date) && (secondObject instanceof Date)) return false;//Если дата сравнивается с чем-то ещё -то всегда выдать несоответствие
    
    //далее сравниваем нормальные объекты
    var keysFirstObj = Object.keys( firstObj );
    var keysSecondObject = Object.keys( secondObject );
    if ( keysFirstObj.length != keysSecondObject.length ) {return false;}
    return !keysFirstObj.filter(function( key ){
        if ( typeof firstObj[key] == "object" ||  Array.isArray( firstObj[key] ) ) {
            return !Object.equals(firstObj[key], secondObject[key]);
        } else {
            return firstObj[key] !== secondObject[key];
        }
    }).length;
}

alert(Object.equals({a:[1,2,3],b:2}, {b:2,a:[1,2,3]})); //true
alert(Object.equals(null, null); //false
alert(Object.equals(1, 1); //true
alert(Object.equals(1, '1');//true
alert(Object.equals(1, {a:1});//false
alert(Object.equals([1,2], [1,2]);//true
alert(Object.equals(new Date(), new Date())//true
Ответить с цитированием
  #16 (permalink)  
Старый 11.10.2012, 00:31
Аватар для Maxmaxmахimus
司会
Отправить личное сообщение для Maxmaxmахimus Посмотреть профиль Найти все сообщения от Maxmaxmахimus
 
Регистрация: 29.02.2012
Сообщений: 198

tenshi, же написал


Object.prototype.valueOf= function(){ return JSON.stringify( this ) }

alert( {a:{b:2}} == {a:{b:2}} )
Ответить с цитированием
  #17 (permalink)  
Старый 11.10.2012, 00:43
Аватар для Nekromancer
Профессор
Отправить личное сообщение для Nekromancer Посмотреть профиль Найти все сообщения от Nekromancer
 
Регистрация: 06.05.2009
Сообщений: 1,163

https://github.com/NekR/Sync/blob/master/core.js#L248
__________________
Нужно равняться на лучших, а не оправдываться за счёт худших.
Ответить с цитированием
  #18 (permalink)  
Старый 11.10.2012, 01:08
Аватар для nerv_
junior
Отправить личное сообщение для nerv_ Посмотреть профиль Найти все сообщения от nerv_
 
Регистрация: 29.11.2011
Сообщений: 3,924

Nekromancer, особо не вглядывался, но при сравнении объектов с "бесконечными" ссылками не зависает из-за рекурсии?

пример "бесконечной" ссылки

var obj = {
    a: some_value,
    b: obj
};
__________________
Чебурашка стал символом олимпийских игр. А чего достиг ты?
Тишина - самый громкий звук
Ответить с цитированием
  #19 (permalink)  
Старый 11.10.2012, 01:18
Аватар для Nekromancer
Профессор
Отправить личное сообщение для Nekromancer Посмотреть профиль Найти все сообщения от Nekromancer
 
Регистрация: 06.05.2009
Сообщений: 1,163

Ну наверно зависнет, да Надо поставить ограничение наверно. Я этот метод не использовал, кажется, просто написал.
__________________
Нужно равняться на лучших, а не оправдываться за счёт худших.
Ответить с цитированием
  #20 (permalink)  
Старый 11.10.2012, 01:40
Аватар для Aetae
Тлен
Отправить личное сообщение для Aetae Посмотреть профиль Найти все сообщения от Aetae
 
Регистрация: 02.01.2010
Сообщений: 6,517

Ну, от рекурсии при сериализации избавится просто - составлять по мере исследования массив объектов.
Но для сравнения этого скорее всего не нужно.
__________________
29375, 35
Ответить с цитированием
Ответ



Опции темы Искать в теме
Искать в теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Динамическая вставка объектов cathunter jQuery 2 09.12.2009 17:48
ie6,7,8 Невозможно соединится с сервером программирования объектов sshz Internet Explorer 0 19.11.2009 15:32
Быстрый поиск объектов Shasoft Общие вопросы Javascript 7 30.07.2009 05:28
ООП: как создавать наследника от встроенных объектов? Langalier Общие вопросы Javascript 17 02.02.2009 17:07
Как определить включен ли поддержака объектов ActoveX feodul Events/DOM/Window 5 02.06.2008 12:04