gpt4 book ai didi

javascript - 在 Javascript 中扩展对象数组

转载 作者:太空宇宙 更新时间:2023-11-04 00:56:09 25 4
gpt4 key购买 nike

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

[{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'}]

我想在此数组上创建函数,以便我可以使用如下调用:

var node = library.findById(4);

并且还可以扩展实际对象本身,以便我可以创建如下函数:

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 个 Node ,这是实现此目的的合理方法吗?我可以使用更好的模式来解决问题吗?

最佳答案

您应该按 Node 的 id 存储 Node (我认为它是唯一的),以便您可以快速访问它们。使用数组(对于不太稀疏的整数 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;
};

这样,它就不必每次都筛选整个数组。你的库的其余部分看起来不错。

关于javascript - 在 Javascript 中扩展对象数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29760313/

25 4 0
文章推荐: node.js - Oriento 查询生成器类似子句
文章推荐: c - 如何将c中的字符数组转换为字符串,以便对其进行字符串操作?
文章推荐: css - 在 Bootstrap 网格中创建单边边框而不更改
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com