2016-01-05 45 views
1

我现在有这个对象:搜索整个JavaScript对象与孩子

var obj = { 
    1: { 
    title: 'test', 
    children: { 
     2: { 
     title: 'test2', 
     children: {} 
     }, 
     3: { 
     title: 'test3', 
     children: {} 
     } 
    } 
    } 
}; 

整个想法是我提出的功能,将项目添加到该对象。作为参数我发送父。

现在,我想知道如何得到正确的物品对象。例如,如果我发送父'2',它会得到2:从1:的孩子。我能想到的唯一方法是for循环,但我不知道是否有更有效的方法。孩子们可以延长得更多,所以父母有孩子,孩子们无休无止。至少这是整个想法。

我觉得有几个项目for循环是可以的,但我认为如果我有超过50个项目它已经很慢了,它甚至会更慢。

+0

*“如果我有超过50个项目它已经慢” * - 好,取决于你的“慢”的定义,但有50次递归将采取以毫秒为单位的大部分分数。在任何情况下... – JJJ

+0

[在深层对象中按名称查找属性]的可能重复(http://stackoverflow.com/questions/15642494/find-property-by-name-in-a-deep-object) – JJJ

回答

1

该解决方案使用Object.keys()获取给定对象的所有密钥,并使用短循环Array.prototype.some()寻找密钥的数组迭代。如果找到,则返回引用,否则将检查该项目是否有对象。如果是这样,则用getReference()进行新的搜索。

var obj = { 1: { title: 'test', children: { 2: { title: 'test2', children: {} }, 3: { title: 'test3', children: {} } } } }; 
 

 
function getReference(o, p) { 
 
    var r; 
 
    Object.keys(o).some(function (k) { 
 
     if (k === p) { 
 
      r = o[k]; 
 
      return true; 
 
     } 
 
     if (typeof o[k] === 'object') { 
 
      r = getReference(o[k], p); 
 
      return !!r; 
 
     } 
 
    }); 
 
    return r; 
 
} 
 

 
var x = getReference(obj, '2'); 
 
document.write(x.title);

+0

非常感谢! :) –

0

如果你想增加要快,你可以在对象或地图(ES6)保存您的子节点的索引。它看起来是这样的:

function Tree() { 
    this.data = {}; 
    this.indexes = {0: this.data}; 
} 

Tree.prototype = { 
    addNode: function(parentIndex, index, node) { 
     // handle cases when parentIndex does not exist 
     // handle cases when index already exists 
     this.indexes[index] = node; 
     var parent = this.indexes[parentIndex]; 
     parent.children = parent.children || {}; 
     parent.children[index] = node;    
    } 
} 

var tree = new Tree(); 

tree.addNode(0, 1, { title: 'test' }); 
tree.addNode(1, 2, { title: 'test2' }); 
tree.addNode(1, 3, { title: 'test3' }); 

console.log(tree.data);