javascript - 通过标识符访问对象
问题描述
我正在从我的 sql 数据库中获取关系数据。该数据具有标识符(唯一/主键)。样本:
[
{id:1, value:“test“, cat:2},
{id:2, value:“test“, cat:3},
{id:3, value:“test“, cat:4}, ...
]
正如许多网站(包括 Stackoverflow)所建议的那样,您可以使用数组的 find 函数通过它们的 id 访问元素:
获取 id 为 3 的对象值的示例:
SomeVal = myArray.find(x => x.id === 3).value
但是,我不同意这种做法。我不明白您为什么要搜索标识符,因为您可以直接通过 id 直接访问元素,这确实是使用标识符的想法。
您可能会争辩说,数组的 find 函数会因为它超快而完成这项工作,但在我的情况下这还不够好,因为性能具有最高优先级。
结果,我目前“滥用”数组的索引作为标识符号来直接访问元素。样本:
SomeVal = myArray[3].value
但是,我在 javascript/typescript 中寻找一种更可行的方法来直接通过 id 访问元素。
我不需要创建/更新/删除元素,我只需要在获取后访问它们。
如果另一个数据结构对此更好,我根本不能使用数组。
我不建议用直接索引访问替换数组的字段搜索功能,例如 find。并且讨论的核心不应是 3 访问哪个数组元素,因为这是一个简单的示例。该问题的主要思想是,如果像它这样的数组是标识符,是否可以使用索引,因此使用与 id 字段直接相关的索引。
解决方案
但是,我不同意这种做法。我不明白您为什么要搜索标识符,因为您可以直接通过 id 直接访问元素,这确实是使用标识符的想法。
您不能使用您显示的结构直接通过 ID 访问。你需要一个不同的结构来做到这一点。
结果,我目前“滥用”数组的索引作为标识符号来直接访问元素。样本:
SomeVal = myArray[3].value
那不会访问带有id: 3
. 它访问undefined
(使用您的示例数据)。索引从 0 开始,而不是 1。此外,除非底层系统保证它,否则您不能依赖条目id
有序且没有间隙等。
要访问 by id
,请将数组转换为 Map 或对象。然后,您可以重用该映射或对象,并从映射键/对象属性名称的次线性查找时间中受益。
地图(我推荐这个):
// Note that I've put them out of order to demonstrate we're really getting by id
const array = [
{id:2, value:"test", cat:3},
{id:1, value:"test", cat:2},
{id:3, value:"test", cat:4},// ...
];
const map = new Map(array.map(entry => [entry.id, entry]));
console.log(map.get(1));
目的:
// Note that I've put them out of order to demonstrate we're really getting by id
const array = [
{id:2, value:"test", cat:3},
{id:1, value:"test", cat:2},
{id:3, value:"test", cat:4},// ...
];
const obj = Object.fromEntries(array.map(entry => [entry.id, entry]));
console.log(obj[1]);
推荐阅读
- c# - .Net 核心 - 停止服务/用户管理器被处置/保持服务活动
- reactjs - 如何在反应中将多个值传递给我的函数?
- scala - 如何在scala中读取CSV文件
- server - 原生移动应用的 OAuth 2.0 授权码授权 + PKCE
- javascript - 如何在 HTML 和 Javascript 的动态列表中显示格式化的 HTML 文本
- javascript - 如何在打字稿中实现具有多个匿名函数的接口
- javascript - Chart.js 图表不显示(引导程序)
- javascript - jQuery onload 代码如何可重用于缩略图 2 和 3
- scala - 如何有效地获取数据帧记录大小的最大长度
- c# - 如何使着色器(统一)与特定强度的灯光交互?