【问题标题】:Find an element in a collection list using typescript使用打字稿在集合列表中查找元素
【发布时间】:2017-09-16 07:29:42
【问题描述】:

我正在为我的问题寻找更好的解决方案。我有一个这种格式的数据集合,想知道使用打字稿从集合中检索数据的最快方法是什么。

  • 首先是通过解析集合中的每个元素来识别,并在元素被识别后立即分解。

我们可以在 C# 和其他语言中使用更好的解决方案。但是,我正在寻找更好的打字稿解决方案。

结构如下:

myData:
{
  Id: string,
  Name: string,
  Address: string
  Salary: number
  phone: number
}

假设我们有大约 500 条记录,其中 Id 是唯一的。 我在一个表格中只显示(ID 和名称),该表格的每一行都有复选框。

当我选择一些复选框时,我需要通过这个列表收集每一行的相应数据并执行一些操作。

var selected: ImyData[];
for(var d in data)
{
  if(d.id == myId)
  {
    this.selected.id = d.id;
    this.selected.address = d.address
    this.selected.salary = d.salary
    return;
   }
 }

但是这种方法会不断检查集合中的每个元素,并返回对性能无效的地址。想知道在打字稿中实现的任何建议吗?

【问题讨论】:

  • 样本数据并不是真正的样本数据:你已经给出了一个结构。
  • 任何你可以在 JavaScript 中做的事情,你都可以在 TypeScript 中做。所以搜索“finding an object by id JavaScript”,你会找到很多答案。
  • 你知道字典/哈希集吗?我很确定您需要它而不是通过查找来遍历项目。

标签: javascript typescript foreach


【解决方案1】:

您可以在 Javascript 中创建一个“字典”(也称为 assoc 数组、哈希表或映射),并获取这样的项目,即 O(1)

var selected = allItems[id];

使用for 循环,您可以初始创建您的字典。您将只执行一次 for 循环,并且每次查找都非常快(因为它不需要 for 循环)

例子:

//init, do this once!
var initObjects = [{ id: "id1", name:"name1" }, { id: "id2", name:"name2" }]

var dict = {};

for (i = 0; i < initObjects.length; i++) {
    var item = initObjects[i];
    dict[item.id] = item;
}

//retrieving values. No loops! O(1) complexity. Very fast!
console.log(dict["id2"])
console.log(dict["id1"])

O(1) = 与列表大小无关的恒定查找时间。因此,在包含 100 或 1000000 个项目的列表中查找成本相同)

【讨论】:

【解决方案2】:

您可以创建一个函数来迭代对象,使用解构赋值仅在for..of 循环中获取"Id""Name" 属性,如果匹配,则将return 属性引用作为函数中的对象。

const myData = {
  Id: "a",
  Name: "b",
  Address: "123",
  Salary: "456",
  phone: "789"
}

let myId = "a";

const getIdAndName = (data, id) => {
  for (let {Id, Name} of [myData]) 
    if (Id === id) return {Id, Name}; 
  return `${id} not found in data`;
}

let IdAndName = getIdAndName(myData, myId);

console.log(IdAndName);

【讨论】:

  • 这也每次都循环所有数据? (每次查找平均为 50%)
  • @Julian 不确定您的意思?您的 Answer 方法通过创建一个新对象来 100% 循环数据,是吗?
  • 它是初始化一次,然后在没有循环的情况下检索。初始化是O(n),查找是O(1)。如果您需要 10 件商品,则为 O(n+10)。您的查找是 O(n),因此 10 次查找是 O(n * 10)
  • 所以有 500 个项目,这检查 500*10=5000 个项目,我的 500+10 = 510
  • @Julian 那么您的回答本质上是建议调整数据结构以适应预期要求?在这种情况下,任何一个答案都不需要循环;解决方案是更改数据结构,例如使用Map,其中每个项目都是唯一的;然后mapInstance.get("a")
猜你喜欢
  • 2020-04-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-08-29
  • 2022-07-05
  • 1970-01-01
  • 2019-04-15
相关资源
最近更新 更多