我正在使用ES6 Map对象,其中键是符号,数字或字符串。我选择map over array,因为我经常按键搜索项目,并且每次需要查找键时都不想迭代数组。它也适合我的关键,价值模式 还有很多我需要下一个和上一个项目的操作, 偶尔是第一个也是最后一个 基本上它代表网格表 目前我使用:
Map.keys()
直到找到当前并返回Map.keys()
迭代记住最后一个键,当找到当前返回最后一个键时Map.keys().next().value
Array.from(this._data.keys()).reverse()[0];
最后一个想法是:
let lastKey: any; //I am using TypeScript with "noImplicitAny": true
for (lastKey of map.keys()) { }
哪一个更好?
还有其他可能的解决方案吗?我还在考虑创建具有数组和Map的新Object,但这似乎很多或者可能不是?像这样:
class MapArray
{
map = new Map<string | number | symbol, number>(); //map between keys and array indexes
array: Array<any> = [];
constructor(data: Array<any>)
{
for (const d in data)
{
this.add(d);
}
}
add(value: any)
{
this.array.push(value);
this.map.set(Symbol(), this.array.length - 1);
}
next(currentKey: symbol)
{
const current = this.map.get(currentKey);
if (typeof current !== "undefined")
{
if (current >= this.array.length - 1)
return null; //current is last item
return this.array[current + 1];
}
return this.array[0]; //return first
}
previous(currentKey: symbol)
{
const current = this.map.get(currentKey);
if (typeof current !== "undefined")
{
if (current == 0)
return null; //current is first item
return this.array[current - 1];
}
return this.array[this.array.length - 1]; //return last
}
get(key: symbol)
{
const index = this.map.get(key);
if (typeof index !== "undefined")
return this.array[index];
return null;
}
set(key: symbol, value: any)
{
const index = this.map.get(key);
if (typeof index !== "undefined")
this.array[index] = value;
else
this.add(value);
}
//TODO write delete
//TODO write first/last
//TODO write generator
}
你怎么看?数据通常是小数组(具有3个属性的20个对象项)或具有大数据的较大数组(具有100个或更多属性的1000个对象项)。
代码主要在移动设备上运行,因此内存使用和性能非常重要。
答案 0 :(得分:2)
我还在考虑创建一个具有Array和Map的新类,但这似乎很多?
不,这是正确的行动方针。它是获得索引访问的合理性能的唯一选择。
使用您正在使用的所有操作的抽象总是有用的。您可以在不更改使用该结构的代码的情况下,将实现更换为更简单的(当它足够时)或更精细(当您需要时)。