Javascript 通过对象的标识符访问对象

Javascript 通过对象的标识符访问对象,javascript,typescript,Javascript,Typescript,我正在从我的sql数据库中获取关系数据。此数据具有标识符(唯一/主键)。样本: 正如许多站点(包括Stackoverflow)所建议的那样,您可以使用数组的find函数通过元素的id访问元素: 获取id为3的对象的值的示例: SomeVal = myArray.find(x => x.id === 3).value 然而,我不同意这种做法。我不明白为什么要搜索标识符,因为您可以通过id直接访问元素,这确实是使用标识符的想法 您可能会争辩说,数组的find函数只会完成这项工作,因为它

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

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

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

  SomeVal = myArray.find(x => x.id === 3).value
然而,我不同意这种做法。我不明白为什么要搜索标识符,因为您可以通过id直接访问元素,这确实是使用标识符的想法

您可能会争辩说,数组的find函数只会完成这项工作,因为它是超高速的,但在我的例子中,这还不够好,因为性能具有最高优先级

因此,我目前将数组的索引“误用”为标识符编号,以直接访问元素。样本:

[
   {id:1, value:“test“, cat:2},
   {id:2, value:“test“, cat:3},
   {id:3, value:“test“, cat:4}, ...
]
 SomeVal = myArray[3].value
SomeVal = myArray[3].value
然而,我正在寻找一种更可行的javascript/typescript方法,通过id直接访问元素

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

如果另一个数据结构更适合于此,我就不能使用数组

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

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

无法使用显示的结构通过ID直接访问。要做到这一点,您需要一个不同的结构

因此,我目前将数组的索引“误用”为标识符编号,以直接访问元素。样本:

[
   {id:1, value:“test“, cat:2},
   {id:2, value:“test“, cat:3},
   {id:3, value:“test“, cat:4}, ...
]
 SomeVal = myArray[3].value
SomeVal = myArray[3].value
无法访问id为3的条目。它访问
未定义的
(使用示例数据)。索引从0开始,而不是从1开始。此外,除非底层系统保证,否则您不能依赖于条目处于
id
顺序,没有间隙等

要通过
id
进行访问,请将数组转换为地图或对象。然后可以重用该贴图或对象,并从贴图键/对象属性名称的次线性查找时间中获益

地图(我推荐这个):

//请注意,我把它们按顺序放出来是为了证明我们确实是在按id办事
常量数组=[
{id:2,值:“test”,cat:3},
{id:1,值:“test”,cat:2},
{id:3,值:“test”,cat:4},/。。。
];
const map=newmap(array.map(entry=>[entry.id,entry]);

console.log(map.get(1))
在本例中,您必须使用
查找
的原因是因为您有一个
对象数组
。因此,您无法直接访问id密钥


如果要直接访问id键,则需要将数组转换为对象。

在我看来,有两种方法可以做到这一点

  • 使用数据结构算法(如哈希表)轻松快速地查找元素
  • 创建一个id为键且其值为实体对象的对象。大概是这样的:
    constmyarray=[…];
    const cachedMyArray=cacheData(myArray);
    const anItem=cachedMyArray[3]
    //缓存数据以最快速度查找元素
    接口MyArray{
    ...
    }
    函数cacheData(数组:MyArray[]{
    const cached={};
    array.forEach((项目:MyArray)=>{
    缓存的[item.id]=项;
    });
    返回缓存;
    
    }
    数组中的
    id
    不是索引。我看不出如果不使用带有谓词的
    .find()
    .findIndex()
    ,如何检索
    id:3
    的条目
    myArray[3]
    返回数组中的第四项(因为索引是零基的),它不会像您预期的那样返回
    id:3
    条目。我知道,这正是我说我误用索引作为标识符的原因。假设您位于一个社会的起点(有50所房子的车道),并且每所房子都有一个唯一的编号(标识符)从1到50,它们是随机分布的。你有一个朋友住在20号房子。现在,仅仅因为你知道房子的唯一编号,你就可以直接跳到那所房子吗?不,你需要穿过小路找到20号房子。没有循环就无法通过id访问数组。你所说的是不可能的数据格式。如果您想通过id访问项目,则将其更改为object/map/set,并使用id作为键。查看纯对象中的哈希表数据结构后,只有一个属性的键
    id
    。感谢使用map的想法,但为什么map优于使用预先准备好的数组,而该数组ex值与我的id相关?@Coffecups-如果你有一个数组可以直接索引到,那就像一个映射一样好。但是
    id
    s通常不是像那样连续的低数值,所以我考虑的是一般情况。