1

それで、私は過去数時間、これについて頭を悩ませていたようです..約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.



再帰する時点まではすべてが機能しているように見えますが、どういうわけかオブジェクトの比較がすべて台無しになり、一致しなくなります。

4

1 に答える 1