使用typescript在集合列表中查找元素

时间:2017-04-19 21:28:52

标签: javascript typescript foreach

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

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

我们可以在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;
   }
 }

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

2 个答案:

答案 0 :(得分:4)

您可以在Javascript中创建“词典”(也称为关联数组,哈希表或地图),并获取此类项目,即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项的成本相同时间。

答案 1 :(得分:-1)

您可以创建一个迭代对象的函数,使用解构赋值在"Id"循环中仅获取"Name"for..of属性,如果匹配,则将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);