我正在为我的问题寻找更好的解决方案。我有这种格式的数据集合,并想知道使用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;
}
}
但是这种方法会不断检查集合中的每个元素,并返回一个不具有性能效果的地址。想知道打字稿中的任何建议吗?
答案 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);