ES6地图或数组:需要在TypeScript中使用first,last,previuos,next,get(混合数组和Map)

时间:2016-08-17 07:40:45

标签: javascript arrays dictionary ecmascript-6

我正在使用ES6 Map对象,其中键是符号,数字或字符串。我选择map over array,因为我经常按键搜索项目,并且每次需要查找键时都不想迭代数组。它也适合我的关键,价值模式 还有很多我需要下一个和上一个项目的操作, 偶尔是第一个也是最后一个 基本上它代表网格表 目前我使用:

  • next:遍历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个对象项)。 代码主要在移动设备上运行,因此内存使用和性能非常重要。

1 个答案:

答案 0 :(得分:2)

  

我还在考虑创建一个具有Array和Map的新类,但这似乎很多?

不,这是正确的行动方针。它是获得索引访问的合理性能的唯一选择。

使用您正在使用的所有操作的抽象总是有用的。您可以在不更改使用该结构的代码的情况下,将实现更换为更简单的(当它足够时)或更精细(当您需要时)。