2015-06-03 5 views
0

Итак, я создал конструктор, который я пытаюсь прототип. Я хочу метод, который проверяет каждое свойство в объекте, чтобы увидеть, является ли его пустым, и если он возвращает ключ. Если свойство является объектом, я хочу, чтобы он также проверял этот подэлемент.Рекурсивный метод для проверки объекта

ОБНОВЛЕНО:

Мой код до сих пор:

function Properties(val1, val2, val3, val4){ 
    this.prop1 = val1 || ""; 
    this.prop2 = val2 || ""; 
    this.prop3 = val3 || ""; 
    this.prop4 = val4 || {}; 
} 

Properties.prototype = { 
    isEmpty: function(){ 
     for (key in this) { 
      if(typeof this[key] == "object" && this[key] !== null){ 
       this[key].isEmpty(); 
      } else { 
       if(!this[key]){ 
        console.log(key); 
       } 
      } 
     } 
    } 
} 

var test = new Properties("Something", "", "", {subProp1: "Something Else", subProp2: "", subProp3: {subSubProp1: "", subSubProp2: "" }}); 

Этот метод должен возвращать prop2, prop3, subProp2, subSubProp1, subSubProp2

+0

Что это нужно делать с конструкторами и прототипы? Функция, обнаруживающая пустые словари (объекты), намного лучше стоит. Вы редко хотите проверить свойства экземпляров «класса». Можете ли вы показать полный код (включая конструктор, назначение прототипа, создание экземпляра и вызов метода), а также разработать свой вариант использования? – Bergi

+0

Почему вы ожидаете, что метод существует в подобъекте? Откуда появился ваш подобъект? – Bergi

+0

Да, спасибо, но imo совершенно очевидно, что те объекты, которые вы передаете конструктору (чтобы стать свойствами), не являются * экземплярами 'Properties' * и не будут иметь метод' .isEmpty() '. Вместо этого переходите к новым свойствам («Что-то еще», «», ...). – Bergi

ответ

1

Этот метод не является свойством на объект. Вам нужно пройти в объекте, о котором идет речь. Вы также можете передать массив, чтобы следить за пустые ключи:

var emptyKeys = []; 
function isEmpty(obj, keysArr) { 
    for (var key in obj) { 
     if (typeof obj[key] === "object" && obj.hasOwnProperty(key)) { 
      isEmpty(obj[key], keysArr); 
     } else { 
      if (obj[key] == "" || obj[key] == null) { 
       keysArr.push(key); 
      } 
     } 
    } 
} 

Демо: http://jsfiddle.net/17rt0qy3/1/

Если вы хотите, чтобы это на реальном объекте, просто добавьте вышеупомянутую функцию внутри функции isEmpty:

isEmpty: function(){ 
    var emptyKeys = []; 
    amIEmpty(this, emptyKeys); 

    return emptyKeys; 

    //Actual logic 
    function amIEmpty(obj, keysArr) { 
     for (var key in obj) { 
      if (key == "isEmpty") { 
       continue; 
      } 

      if (typeof obj[key] === "object" && obj.hasOwnProperty(key)) { 
       amIEmpty(obj[key], keysArr); 
      } else { 
       if (obj[key] == "" || obj[key] == null) { 
        keysArr.push(key); 
       } 
      } 
     }   
    } 
} 

Демо: http://jsfiddle.net/17rt0qy3/2/

И скрипка работы с демо-объекта выше: http://jsfiddle.net/17rt0qy3/3/

Aaand другого редактирования, это только log ключи, но это немного чище:

isEmpty: function(obj, keys) { 
    keys = keys || []; 
    obj = obj || this; 
    for (var key in obj) { 
     if (typeof obj[key] === "object" && obj.hasOwnProperty(key)) { 
      this.isEmpty(obj[key], keys) 
     } else { 
      if (obj[key] == "" || obj[key] == null) { 
       keys.push(key); 
      } 
     } 
    } 

    return keys; 
} 

Демо: http://jsfiddle.net/17rt0qy3/8/

+0

Метод является свойством объекта. Я прототипирую класс конструктора. – ChrisJ

+0

Это работает, но я чувствую, что есть более чистый способ. Я уже писал рекурсивные функции, но не как прототип, и мне кажется, что я должен использовать это внутри рекурсии, а не передавать ее другой функции внутри метода. – ChrisJ

+1

@ChrisJ - У меня появилась идея, дайте мне несколько минут – tymeJV

Смежные вопросы