Javascript-форум (https://javascript.ru/forum/)
-   Библиотеки/Тулкиты/Фреймворки (https://javascript.ru/forum/library-toolkit-framework/)
-   -   Сравнение двух объектов (https://javascript.ru/forum/library-toolkit-framework/64431-sravnenie-dvukh-obektov.html)

Sergey69 10.08.2016 18:22

Сравнение двух объектов
 
Доброго времени суток! Глупый вопрос, но все же интересно, как сделать что alert("Неверно"); не выводился столько раз сколько элементов в объекте? Не понимаю от чего так происходит. Подскажите пожалуйста как исправить данную ошибку?
function test () {
    var secret = {
        secret1 : "1+1",
        secret2 : "2+2",
        secret3 : "3+3"
    };

    var answer = {
        answer1 : 2,
        answer2 : 4,
        answer3 : 6
    };

    var otvet, countYes = 0, countNo = 3;

    for (var keyS in secret) {
        otvet = prompt(secret[keyS]);
        for(var keyA in answer) {
            if (otvet == answer[keyA]) {
                alert("Верно");
                countYes++;
                countNo--;
            } else alert("Неверно");
        }
    }
    alert("Верных ответов: " + countYes);
    alert("Неверных ответов: " + countNo);

}
test();

рони 10.08.2016 18:31

Цитата:

Сообщение от Sergey69
for(var keyA in answer)

Sergey69,
function test () {
    var secret = {
        secret1 : "1+1",
        secret2 : "2+2",
        secret3 : "3+3"
    };

    var answer = {
        secret1 : 2,
        secret2 : 4,
        secret3 : 6
    };

    var otvet, countYes = 0, countNo = 3;

    for (var keyS in secret) {
        otvet = +prompt(secret[keyS]);

            if (otvet == answer[keyS]) {
                alert("Верно");
                countYes++;
                countNo--;
            } else alert("Неверно");

    }
    alert("Верных ответов: " + countYes);
    alert("Неверных ответов: " + countNo);

}
test();

Sergey69 10.08.2016 18:39

Спасибо за помощ!:)

DivMan 04.11.2016 20:05

Почему сравнение не работает?

Ведь если в объект добавить valueOf, то знаки сравнений должны работать

https://jsfiddle.net/uhz6v689/

Aetae 04.11.2016 20:21

DivMan, в первом случае - потому что если сравниваются переменные одного типа - никакого приведения типов не происходит. Хочешь сравнить как числа - либо сравнивай с числом, либо приводи к числу заранее.
Во втором случае - потому что после приведения типов(< и > подразумевает именно числа как аргументы, а потому приводит к числам) оба значения равны 22.
И харэ давать ссылки на jsfiddle, для таких простых вещей здесь есть [js run][/js].

рони 04.11.2016 20:42

Aetae, можно txt тег использовать
[JS run][/JS]

Aetae 04.11.2016 20:50

Цитата:

Сообщение от рони (Сообщение 434089)
Aetae, можно txt тег использовать
[JS run][/JS]

Да я уж многие коды на память помню. Забыл # поставить.)
А теги добавляют некрасивый перенос строки.))

DivMan 05.11.2016 11:08

Нормальным ли я способом сделал?

Свойства объектов разном порядке

var objA = {
     prop1: 'value1',
    prop2: 'value2',
    prop3: 'value3',
    prop4: {
        subProp1: 'sub value1',
        subProp2: {
            subSubProp1: 'sub sub value1',
            subSubProp2: [1, 2, {prop2: 1, prop: 2}, 4, 5]
        }
    },
    prop5: 1000,
    prop6: new Date(2016, 2, 10)
}

var objB = {
    prop5: 1000,
    prop3: 'value3',
    prop1: 'value1',
    prop2: 'value2',
    prop6: new Date('2016/03/10'),
    prop4: {
        subProp2: {
            subSubProp1: 'sub sub value1',
            subSubProp2: [1, 2, {prop2: 1, prop: 2}, 4, 5]
        },
        subProp1: 'sub value1'
    }
};


function foo(ob1, ob2){

var res1 = [];
var res2 = [];

	for(var prop in ob1){
			res1.push(prop + ':' + ob1[prop])
		
		if(ob1[prop] == '[object Object]'){
			
			for(key in ob1[prop]){
				res1.push(key + ':' + ob1[prop][key])
				
				if(ob1[prop][key] == '[object Object]'){
					for(kl in ob1[prop][key]){
						res1.push(kl + ':' + ob1[prop][key][kl])
						
					}
				}
			}
		}
		
	}
	
		for(var prop in ob2){
			res2.push(prop + ':' + ob2[prop])
		
		if(ob2[prop] == '[object Object]'){
			
			for(key in ob2[prop]){
				res2.push(key + ':' + ob2[prop][key])
				
				if(ob2[prop][key] == '[object Object]'){
					for(kl in ob2[prop][key]){
						res2.push(kl + ':' + ob2[prop][key][kl])
						
					}
				}
			}
		}
		
	}
	
	
	res1.sort()
	res2.sort()
	
	var obj1 = res1.join()
	var obj2 = res2.join()
	
	console.log(obj1)
	console.log(obj2)
	
	if(obj1 == obj2){
		return alert('Объекты равны')
	}
	
	else{
		return alert('Объекты не равны')
	}
}

foo(objA, objB)


Часовой пояс GMT +3, время: 05:39.