それで、私は過去数時間、これについて頭を悩ませていたようです..約6時間ほど今、私はそれを理解できないようです. SOに関するさまざまな質問/回答を見てきましたが、どれも答えをくれませんでした。
このコード片が何をするべきかを説明することから始めましょう。このコードは、すべての 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"
}
}
};
配列を検出できるプロトタイプ関数の一種。後で使用します。
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のプロトタイプであるfind関数。
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.
再帰する時点まではすべてが機能しているように見えますが、どういうわけかオブジェクトの比較がすべて台無しになり、一致しなくなります。