2015-11-03 4 views
1

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

//an array of objects 

let animals = [{ 
      id: "animal", 
      parent: null 
}, { 
      id: "dog", 
      parent: "animal" 
}, { 
      id: "cat", 
      parent: "animal" 
}, { 
      id: "fish", 
      parent: "animal" 
}, { 
      id: "labrador", 
      parent: "dog" 
}, { 
      id: "cocker spaniel", 
      parent: "dog" 
}, { 
      id: "bass", 
      parent: "fish" 
}, { 
      id: "tuna", 
      parent: "fish" 
}, { 
      id: "house cat", 
      parent: "cat" 
}, { 
      id: "outdoor cat", 
      parent: "cat" 
}, { 
      id: "human", 
      parent: "animal" 
}, { 
      id: "man", 
      parent: "human" 
}, { 
      id: "woman", 
      parent: "human" 
}]; 

//a recursive function to build our object of objects tree 

let makeTreeOfCategories = (categories, parent) => { 
      let parentNode = {}; 
      categories 
         .filter(category => category.parent === parent) 
         .forEach(category => parentNode[category.id] = 
            makeTreeOfCategories(categories, category.id)); 
      return parentNode; 
}; 

console.log(JSON.stringify(makeTreeOfTrees(animals, null), null, 2)); 

Этот код возврата:

{ 
    "animal": { 
     "dog": { 
      "labrador": {}, 
      "cocker spaniel": {} 
     }, 
     "cat": { 
      "house cat": {}, 
      "outdoor cat": {} 
     }, 
     "fish": { 
      "bass": {}, 
      "tuna": {} 
     }, 
     "human": { 
      "man": {}, 
      "woman": {} 
     } 
    } 
} 

Теперь, если мы выполним следующее:

//call our object and store in a variable 

let obj = makeTreeOfCategories(animals, null); 

//loop through the object and alert each child item and its children 

for (var key in obj) { 
      var val = obj[key]; 
      alert("Key: " + key + " value:" + val); 
} 

он предупреждает один раз, говоря «Ключ: значение для животных: [Объект объекта] ", но я не понимаю, почему, я ожидаю, что он вернется с ключом: значение для животных: собака, затем« ключ: значение животного: кошка »и т. д.

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

Кроме того, если вы могли бы сказать мне это тоже, как бы я получить доступ к что-то вроде:

{}.animal.dog.labrador 

Если бы я искал что-то конкретное, например, если Лабрадор имел свойство имя, например.

Я надеюсь, что это имеет смысл, я думаю, что я просто запутываю себя, если что-то только сейчас, но надеюсь, что я ясно дал понять, что я пробовал, и что бы я хотел.

Приветствия, SD

+0

возможный дубликат [Преобразование объекта в строку] (http://stackoverflow.com/q/5612787/1048572) или [Почему объект [Object Object] 'упоминает" дважды?] (http://stackoverflow.com/q/29847665/1048572) – Bergi

ответ

0

Вы петля будет возвращать только свойства родительского объекта - животные. Вам нужно будет рекурсивно вызвать его на каждом дочернем элементе, чтобы получить все предупреждения. Кроме того, причина, по которой вы видите объект Object, связана с тем, что вы пытаетесь преобразовать {} в строку. В вашем дереве ключи - это единственная часть, которую вы можете распечатать без специального toString().

function recursiveAlert(node) { 
    for (var key in node) { 
     var val = node[key] 

     alert("Key: " + key); 

     recursiveAlert(val); 
    } 
} 

На природе вашего [объект Object], если все, что вы хотите это непосредственные дети, вы можете написать функцию, чтобы получить их в виде строки для вас.

function getChildren(node) { 
    // get all properties as an array, then convert to a string 
    return Object.keys(node).toString(); 
} 

function recursiveAlert(node) { 
    for (var key in node) { 
     var val = node[key] 

     alert("Key: " + key + ", Val: " + getChildren(val)); 

     recursiveAlert(val); 
    } 
} 

Наконец, как можно проверить наличие определенного свойства. если у вас есть объект

var tree = {id: 2}; 

и вы пытаетесь получить доступ к свойству на нем, не существует, вы получите неопределенными, а falsy значение.

tree.dog; 
// => undefined 

Это означает, что вы можете проверить наличие свойств с использованием операторов if. Тем не менее, вы можете идти только на один слой, то есть.

tree.dog.lab; 
// => TypeError 

Но это нормально.

if (tree.dog) { 
    if (tree.dog.lab) { 
    // do something 
    } 
} 
0

Вы получаете значение: [объект Object]»правильно это как for in работа в JavaScript
для в итерации значение ключа на объект или массив, например, если структура вашего объекта что-то вроде это

var obj = {"animal":"dog","Bird":"peacock"} 

for (var key in obj) { 
     alert("Key: " + key + " value:" + val); 
}  

Выход

Key: animal value:dog 
Key: Bird value:peacock 

Но в вашем случае

«животное» является верхний ключ вложенного объекта, который удерживать объекты внутри него, поэтому ваш пробег цикл только один раз и возвращения объектов

«животное» на самом деле держать следующее значение

"dog": { 
      "labrador": {}, 
      "cocker spaniel": {} 
     }, 
     "cat": { 
      "house cat": {}, 
      "outdoor cat": {} 
     }, 
     "fish": { 
      "bass": {}, 
      "tuna": {} 
     }, 
     "human": { 
      "man": {}, 
      "woman": {} 
     } 

Это объект, поэтому [Объект объекта] показан в предупреждении.

Вы можете видеть ключи своего внутреннего объекта таким образом;

for (var key in obj) { 
      var val = obj[key]; 
      alert("Key: " + key + " value:" + Object.keys(val)); 
} 

выход:

Key: animal value:dog,cat,fish,human 

Для вашего второго вопроса как получить значение свойства объекта с помощью "" использование

console.log(obj.animal.dog.labrador) 

это показать Object {}

, и если вы хотите читать ключи использовать

console.log(Object.keys(obj.animal.dog)) он покажет

["labrador", "cocker spaniel"]