Так что, кажется, я несколько раз царапаю голову над этим в течение последних нескольких часов .. примерно около 6 часов, и я просто не могу понять, как это понять. Я посмотрел на различные вопросы/ответы на SO, но никто из них не дал мне ответа.Ошибка рекурсивного сравнения объектов Javascript
Позвольте мне начать с объяснения того, что этот кусок кода SUPPOSE делать. Этот код будет соответствовать свойствам объекта с другим объектом, если он совпадает со всем объектом object_layout.
Примечание: Я хочу, чтобы объекты соответствовали, даже если полный object_layout, если не указан.
Объект данных:
var data = {
"some object" : {
name: "some object",
has: "properties",
types: [
"some",
"type",
"of",
"array"
]
},
"another": {
property: false,
name: "another",
object: "here",
test: "this",
object: "strings"
},
"minimal object": {
test: "this too"
},
"minimal matching object": {
property: true,
name: "minimal matching object",
test: "this",
object: "strings"
},
"matching object": {
test: "this",
property: true,
name: "matching object",
this_object: {
some: "object"
}
}
};
Функция Прототип TypeOf, который может обнаружить массивы. Будет использоваться позже.
Object.prototype.typeof = function(object) {
if (!object) { return 'undefined' }
if (typeof(object) === "object" && 'splice' in object && 'join' in object) {
return 'array';
}
return typeof(object);
}
Функция находкой, которая является прототипом объекта.
Object.prototype.find = function(object_layout) {
var found_objects;
for (object in this) { // loop through objects in this object.
if (object != 'typeof' && object != 'find') { // skip these functions in our object.
console.log('object: ' + object);
for (property in object_layout) {
if (object_layout.hasOwnProperty(property)) {
var object_type = Object.typeof(object_layout[property]);
if (object_type == 'string') {
console.log('Property ' + property);
console.log('value: ' + object_layout[property]);
if (object_layout[property] != this[object][property]) { // if object_layout property doesnt exist in object.
if (found_objects && found_objects[object]) { console.log(object + " removed from found_objects"); delete found_objects[object]; }// if in found_objects then remove.
console.log("property doesn't exist.");
break; // break to next object.
}
if (!found_objects) { found_objects = {} }
if (!found_objects[object]) { console.log("Added object: " + object); found_objects[object] = this[object]; }
} else if (object_type == 'object') { // recurse into object
console.log('object type: ' + property);
console.log("Recurse: " + JSON.stringify(this[object][property]));
if (this[object][property]) {
this[object][property].find(object_layout[property]); // recurse broken...
}
break; // break to next object
}
}
}
}
}
if (found_objects) { return found_objects; }
return false;
}
Вызов функции:
var results = data.find(
{
test: "this",
property: true,
this_object: {
some: "object"
}
};
console.log(results), true, 3));
Выход журнала (обрезаны последний бит)
Added object: matching object
Property property
value: true
object type: this_object
Recurse: {"some":"object"}
object: some
Property some
value: object
property doesn't exist.
Все, кажется, работает до момента, когда оно повторяется, тогда как-то сравнение объектов становится все испорченным, и оно больше не подходит.