我正在从sql数据库中获取关系数据。该数据具有标识符(唯一/主键)。样本:
[
{id:1, value:“test“, cat:2},
{id:2, value:“test“, cat:3},
{id:3, value:“test“, cat:4}, ...
]
如许多站点(包括Stackoverflow)上所建议的那样,您可以使用数组的find函数通过其id访问元素:
Find object by id in an array of JavaScript objects
获取ID为3的对象的值的示例:
SomeVal = myArray.find(x => x.id === 3).value
但是,我不同意这种方法。我不知道为什么要搜索标识符,因为您可以直接通过id直接访问元素,这实际上就是使用标识符的想法。
您可能会争辩说,数组的find函数将以超快的速度完成任务,但是在我的案例中,这并不足够,因为性能具有最高优先级。
结果,我目前“滥用”数组的索引作为标识符号以直接访问元素。样本:
SomeVal = myArray[3].value
但是,我正在javascript / typescript中寻找一种更可行的方法来通过id直接访问元素。
我不需要创建/更新/删除元素,只需要在获取它们后就可以访问它们。
如果另一个数据结构对此更好,我绝对不能使用数组。
我不建议将数组的字段搜索功能(例如find)替换为直接索引访问。并且讨论的核心不应是3可以访问哪个数组元素,因为这是一个简单的示例。这个问题的主要思想是,如果像这样的数组作为标识符,使用索引是否可行,因此使用与id字段直接相关的索引。
答案 0 :(得分:4)
但是,我不同意这种方法。我不知道为什么要搜索标识符,因为您可以直接通过id直接访问元素,这实际上就是使用标识符的想法。
您不能使用显示的结构通过ID直接访问。您需要一个不同结构来做到这一点。
结果,我目前“滥用”数组的索引作为标识符号以直接访问元素。样本:
SomeVal = myArray[3].value
无法访问id: 3
的条目。它访问undefined
(带有您的示例数据)。索引从0开始,而不是1。此外,除非底层系统保证,否则您不能依赖条目id
的顺序而不会出现空格等。
要通过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]);
答案 1 :(得分:1)
在这种情况下,必须使用find
的原因是因为您有array of objects
。因此,您无法直接访问ID密钥。
如果要直接访问id键,则需要将数组转换为对象。
答案 2 :(得分:0)
我认为有两种方法可以做到这一点。
const myArray = [...];
const cachedMyArray = cacheData(myArray);
const anItem = cachedMyArray[3]
// Caching data to find elements fastest
interface MyArray {
...
}
function cacheData(array: MyArray[]) {
const cached = {};
array.forEach((item: MyArray) => {
cached[item.id] = item;
});
return cached;
}