2016-01-05 78 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);