首页 > 解决方案 > 通过标识符访问对象

问题描述

我正在从我的 sql 数据库中获取关系数据。该数据具有标识符(唯一/主键)。样本:

[
   {id:1, value:“test“, cat:2},
   {id:2, value:“test“, cat:3},
   {id:3, value:“test“, cat:4}, ...
]

正如许多网站(包括 Stackoverflow)所建议的那样,您可以使用数组的 find 函数通过它们的 id 访问元素:

在 JavaScript 对象数组中按 id 查找对象

获取 id 为 3 的对象值的示例:

  SomeVal = myArray.find(x => x.id === 3).value

但是,我不同意这种做法。我不明白您为什么要搜索标识符,因为您可以直接通过 id 直接访问元素,这确实是使用标识符的想法。

您可能会争辩说,数组的 find 函数会因为它超快而完成这项工作,但在我的情况下这还不够好,因为性能具有最高优先级。

结果,我目前“滥用”数组的索引作为标识符号来直接访问元素。样本:

 SomeVal = myArray[3].value

但是,我在 javascript/typescript 中寻找一种更可行的方法来直接通过 id 访问元素。

我不需要创建/更新/删除元素,我只需要在获取后访问它们。

如果另一个数据结构对此更好,我根本不能使用数组。

我不建议用直接索引访问替换数组的字段搜索功能,例如 find。并且讨论的核心不应是 3 访问哪个数组元素,因为这是一个简单的示例。该问题的主要思想是,如果像它这样的数组是标识符,是否可以使用索引,因此使用与 id 字段直接相关的索引。

标签: javascripttypescript

解决方案


但是,我不同意这种做法。我不明白您为什么要搜索标识符,因为您可以直接通过 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]);


推荐阅读