2016-12-13 6 views
0

У меня есть объект вроде этого:Javascript значения объекта прибудет выше

var structure = { 
    "root":{ 
     "name":"Main Level", 
     nodes:{ 
      "node1":{ 
       "label":"Node 1" 
      }, 
      "node2":{ 
       "label":"Node 2", 
       "selected": true 
      }, 
      "node3":{ 
       "label":"Node 3" 
      } 
     } 
    } 
} 

В JavaScript Как искать объект для «выбрано: истинно», и получить значение метки над ней, то есть «Node 2»

ответ

1

Вы хотите использовать цикл for.

var nodes = structure.roots.nodes; 
var nodeYouWant; 
for (var obj in nodes){ 
    if (nodes[obj].selected == true){ 
     nodeYouWant = obj; // Now "node2" 
    } 
} 
+0

Вам необходимо проверить 'узлы [OBJ] .selected', а не' obj.selected'. –

+0

Вы правы. Спасибо за уловку. – TheValyreanGroup

+0

Также нет необходимости в '== true' части. Просто 'if (node ​​[obj] .selected) {...' достаточно. –

1

Вы можете перебрать ключи от structure.root.nodes (которые вы можете получить с Object.keys) и проверить, является ли объект узла в этом ключе является selected. Для целей этой демонстрации я только что зарегистрировал выбранный node.label.

var structure = { 
 
    "root": { 
 
    "name": "Main Level", 
 
    nodes: { 
 
     "node1": { 
 
     "label": "Node 1" 
 
     }, 
 
     "node2": { 
 
     "label": "Node 2", 
 
     "selected": true 
 
     }, 
 
     "node3": { 
 
     "label": "Node 3" 
 
     } 
 
    } 
 
    } 
 
} 
 

 
var nodes = structure.root.nodes, 
 
    keys = Object.keys(nodes) 
 

 
for (var i = 0; i < keys.length; i++) { 
 
    var node = nodes[keys[i]] 
 
    if (node.selected) { 
 
    console.log("Selected:", node.label) 
 
    break; 
 
    } 
 
}

1
for (n in structure.root.nodes) { 
    if (structure.root.nodes[n].selected) { 
    console.log("the node which is selected is: " + n); 
    } 
} 
+1

Нет необходимости использовать 'hasOwnProperty' при работе с объектными литералами. –

+0

вы очень правы, отредактируете, спасибо за указание – faboolous

0

Это будет рекурсивно траверс ваш объект ищет для выбранного значения, возвращая имя ключа, если найден.

const structure = { 
 
    "root": { 
 
    "name": "Main Level", 
 
    nodes: { 
 
     "node1": { 
 
     "label": "Node 1" 
 
     }, 
 
     "node2": { 
 
     "label": "Node 2", 
 
     "selected": true 
 
     }, 
 
     "node3": { 
 
     "label": "Node 3" 
 
     } 
 
    } 
 
    } 
 
} 
 

 
const findSelected = (obj, ret = '') => { 
 
    for (let key in obj) { 
 
    if (obj[key].selected) { 
 
     return key 
 
    } 
 
    if (obj[key].constructor === Object) { 
 
     ret = findSelected(obj[key]) 
 
     if (ret) return ret 
 
    } 
 
    } 
 
} 
 

 
console.log(
 
    findSelected(structure) 
 
)

0

Может быть, вы можете попробовать ниже способом.

var structure = { 
    "root": { 
     "name": "Main Level", 
     nodes: { 
      "node1": { 
       "label": "Node 1" 
      }, 
      "node2": { 
       "label": "Node 2", 
       "selected": true 
      }, 
      "node3": { 
       "label": "Node 3" 
      } 
     } 
    } 
}; 
let nodes = structure.root.nodes; 
Object.keys(nodes).forEach(key => { 
    if(nodes[key].selected === true){ 
     //do something like below 
     //console.log(nodes[key].label); 
    } 
}); 

Ссылка: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/keys