有没有办法通过索引值删除地图对象?类似于Map.prototype.delete()

时间:2019-07-15 04:16:51

标签: typescript

在Angular 6项目中,我有一张地图来存储一些值。在文档中,我使用键值管道遍历此映射。这很好。我需要知道的是,当用户单击某个项目时,那么我该如何删除该索引之后的每个后续项目?有没有一种按索引值删除的方法?

我尝试了Map.prototype.clear()Map.prototype.delete(key)。但是我需要按索引而不是键进行删除。

<div *ngFor="let prod of this.wrapperMap | keyvalue; let i = index;">
    <li class="breadcrumb-item active" aria-current="page" (click)="selectProductObject(prod.value, i)">{{this.master.productsMap.get(prod.key)['productName']}}</li>
</div>

比方说,我们在地图上有四个项目,一个用户单击第一个索引。然后我们需要删除索引1之后的每个索引。

1 个答案:

答案 0 :(得分:0)

我们可以考虑映射中的下一个键,而不是下一个索引(索引+ 1):

function deleteNextKey<K, V>(map: Map<K, V>, key: K): boolean {
  const nextKey = getNextKey(map, key);
  return nextKey.hasValue && map.delete(nextKey.value);
}

function getNextKey<K, V>(map: Map<K, V>, key: K): { hasValue: true, value: K } | { hasValue: false } {
  const keys = [...map.keys()];
  const index = keys.findIndex(x => x === key);
  return index >= 0 && index < keys.length - 1
    ? { hasValue: true, value: keys[index + 1] }
    : { hasValue: false };
}

const map = new Map<string, string>([
  ['A', 'Item A'],
  ['B', 'Item B'],
]);

console.log(deleteNextKey(map, 'Z'), JSON.stringify([...map.entries()])); // false "[["A","Item A"],["B","Item B"]]"
console.log(deleteNextKey(map, 'B'), JSON.stringify([...map.entries()])); // false "[["A","Item A"],["B","Item B"]]"
console.log(deleteNextKey(map, 'A'), JSON.stringify([...map.entries()])); // true "[["A","Item A"]]"

TypeScript playground