在Javascript中扩展一个对象数组

我有一个对象的数组,如:

[{id: 1, parentId: 0, title: 'root'}, {id: 2, parentId: 1, title: 'home'}, {id: 3, parentId: 1, title: 'level 1'}, {id: 4, parentId: 2, title: 'level 2'}] 

我想在这个数组上创build函数,所以我可以使用如下调用:

 var node = library.findById(4); 

也可以扩展自己的实际对象,所以我可以创build如下的函数:

 var parent = node.parent(); var grandparent = parent.parent(); var children = grandparent.children(); 

到目前为止,我正在这样做:

 // server.js var library = require('./library').init(nodes); // library.js 'use strict'; var _ = require('lodash'), Node = require('./node'); function objectifyNodes(lib, nodes) { var a = []; nodes.forEach(function (n) { a.push(new Node(lib, n)); }); return a; } function Library(nodes) { this.nodes = objectifyNodes(this, nodes); } Library.prototype.findById = function(id) { var x = _.find(this.nodes, function(node) {return node.id === id; }); if (x) { return x; } return null; }; module.exports = { init: function(nodes) { var lib = new Library(nodes); return lib; } }; // node.js 'use strict'; var _ = require('lodash'); function Node(lib, properties) { _.extend(this, properties); this.lib = lib; } Node.prototype.parent = function() { return this.lib.findById(this.parentId); }; Node.prototype.children = function() { return this.lib.findByParentId(this.id); }; module.exports = Node; 

鉴于他们可能是1000年的节点这是一个合理的方式来实现呢? 有一个更好的模式,我可以用一个解决scheme?

您应该通过他们的id (我认为是唯一的)存储节点,以便您可以快速访问它们。 使用数组(对于不太稀疏的整数ID),对象(默认)或Map (在最近的node.js版本中)。

 function objectifyNodes(lib, nodes) { var a = {}; nodes.forEach(function (n) { a[n.id] = new Node(lib, n); }); return a; } Library.prototype.findById = function(id) { return this.nodes[id] || null; }; 

这样,每次都不必筛选整个arrays。 你的图书馆的其余部分似乎很好。