Javascript 在地图中的特定索引处插入
正如Javascript 在地图中的特定索引处插入,javascript,typescript,dictionary,Javascript,Typescript,Dictionary,正如Map的文档所述: 贴图中的键是有序的,而添加到对象中的键不是有序的。因此 当对其进行迭代时,Map对象按顺序返回键 插入 为了充分利用这一点,我需要按照给定的特定顺序将一个元素插入Map 我知道这可以通过数组来实现,但我更喜欢使用Map,因为我需要按键进行大量查找,而Map在这种情况下运行良好,同时易于维护 我想出了这样的办法,我想知道是否有更好的办法 function insertAtIndex(index, key, value, map){ var iterator1 =
Map
的文档所述:
贴图中的键是有序的,而添加到对象中的键不是有序的。因此
当对其进行迭代时,Map对象按顺序返回键
插入
为了充分利用这一点,我需要按照给定的特定顺序将一个元素插入Map
我知道这可以通过数组来实现,但我更喜欢使用Map
,因为我需要按键进行大量查找,而Map
在这种情况下运行良好,同时易于维护
我想出了这样的办法,我想知道是否有更好的办法
function insertAtIndex(index, key, value, map){
var iterator1 = map[Symbol.iterator]();
var tmpMap = new Map();
var tmpIndex=0;
for (let item of iterator1) {
if(tmpIndex === index){
tmpMap.set(key, value);
}
tmpMap.set(item[0], item[1]);
tmpIndex++;
}
return tmpMap;
}
或
insertCardAtIndex(索引:编号,键:字符串,值:boardCard,映射:映射):映射{
设clonedMap=newmap(Map);
设tmpMap=newmap();
设tmpIndex=0;
for(让数组.from的条目(clonedMap.entries())){
if(tmpIndex==索引){
tmpMap.set(键、值);
}
tmpMap.set(条目[0],条目[1]);
tmpIndex++;
}
返回tmpMap;
}
对于我的用例,我将永远不必处理一个足以使性能成为主要关注点的映射,因此如果这能使代码更具可读性和可维护性,我愿意牺牲性能
我使用的地图有一个“字典”的价值观。无法按特定顺序插入元素这一事实让我怀疑是否应该使用数组,即使有快速查找,以及类似
.has()
、.get()
和.set()的方法
非常有用,但不值得在特定索引处插入。您可以将映射
转换为数组
,用于插入元素,然后再次转换为映射
这不是一个有效的解决方案,但您提到在您的用例中,可维护性比性能更重要
如果索引大于地图的大小,此版本的优点是可以工作。例如,在位置map.size+1
插入一个元素仍然会在底部添加项目,在算法中,项目不会在底部插入。如果您确实希望忽略超出范围的插入,那么可以通过在函数中进行检查轻松地对其进行寻址,但这似乎更健壮
函数insertAtIndex(索引、键、值、映射){
const arr=数组。from(map);
arr.splice(索引,0,[键,值]);
返回新地图(arr);
}
常数m=新映射();
m、 集合('0',0);
m、 集合('1',1);
m、 集合('2',2);
log(Array.from(m.keys());
设m2=插入指数(1,'0.5',0.5,m);
console.log(Array.from(m2));
m2=插入索引(0’-1’,-1,m2);
m2=插入索引(5,'5',5,m2);
m2=插入索引(10,'10',10,m2);
console.log(Array.from(m2))代码>为什么不按照你喜欢的方式排列一组地图的键呢?我的意思是,在我的例子中,我有一些看板,我想用示例来组织一切。但是当你把卡片从一块板拖放到另一块板上,或者在同一块板内。有太多的索引操作更改正在进行。我相信在这种情况下使用map不是最好的解决方案。我希望能够通过id轻松找到一张卡,并移动它。第一部分还可以,第二部分比使用简单的对象数组要混乱得多。我想我会放弃我的地图
insertCardAtIndex(index: Number, key: string, value:boardCard, map:Map<string, boardCard>): Map<string, boardCard> {
let clonedMap = new Map(map);
let tmpMap = new Map<string, boardCard>();
let tmpIndex = 0;
for (let entry of Array.from(clonedMap.entries())) {
if(tmpIndex === index){
tmpMap.set(key, value);
}
tmpMap.set(entry[0], entry[1]);
tmpIndex++;
}
return tmpMap;
}