通过标识符访问对象

时间:2020-01-07 13:19:08

标签: javascript typescript

我正在从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字段直接相关的索引。

3 个答案:

答案 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)

我认为有两种方法可以做到这一点。

  1. 使用HashTable等数据结构算法轻松快速地找到元素。
  2. 创建一个id为key且其值为实体对象的对象。像这样的东西:
    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;
    }