使用JS模拟Map容器

本文介绍了一个使用JavaScript模拟Map容器的实现方法。通过定义一个Map函数并为其添加put、get、remove等方法,实现了类似Map的基本功能。此外,还介绍了如何使用new关键字创建对象实例,并通过控制台输出验证了各项功能的正确性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1、前言

自己对JS的了解也不是很深入。最近看了一个视频,讲述JS的深入用法,感觉很有意思,就选择里面的一个小Demo(模拟Map容器)来体会一下JS的强大之处。

2、思想

主要使用JS中对象的特殊性,使用obj[key]=value的特性,来完成Map容器的K-V存储、获取、修改、删除、判断、遍历等。

3、JS代码解释及分析

//模拟Map集合
function Map(){
    var obj = {};

    //添加put方法
    this.put = function(key,value){
        obj[key] = value;
        console.log("添加数据成功:" + key + "--" + value);
    }

    //添加get方法
    this.get = function(key){
        return obj[key];
    }

    //添加删除方法
    this.remove = function(key){
        delete obj[key];
        console.log("删除数据成功:" + key );
    }

    //添加容器长度
    this.size = function(){
        var count = 0;
        for(var attr in obj){
            count++;
        }
        return count;
    }

    //添加是否包含的key的方法
    this.contains = function(key){
        var flag = false;
        for(var k in obj){
            if(key == k){
                flag = true;
            }
        }
        return flag;
    }

    //判断容器是否为空
    this.isEmpty = function(){
        if(this.size() == 0){
            return true;
        }
        return false;
    }

    //遍历map
    this.each = function(){
        for(var k in obj){
            console.log(k + "--" + this.get(k));
        }
    }

}

/**
    程序的关键在此处开始。JS中使用的new关键字,但是并非和java中的对象一样。
java对象是有构造函数的,而JS中没有。function Map()貌似像Map的构造函数,其实
不然,只不过是一个普通函数,Map()就是为了调用function Map()的。所以Map也可
以改成其他名称。
    new关键字只是创建后后面函数对应的一个对象,然后使用变量接收。详细的new解释
可以参照:http://www.cnblogs.com/onepixel/p/5043523.html
*/
var map = new Map();

//控制台结果输出
console.log("集合是否为空:" + map.isEmpty());
map.put("1","judy");
map.put("2","lucy");
map.put("3","lily");
console.log("集合是否为空:" + map.isEmpty());
console.log("查询key为2的值" + map.get("2"));
map.put("2","擎天柱");
console.log("修改key为2的值为擎天柱");
console.log("查询key为2的值" + map.get("2"));
map.remove("2");
console.log("查询key为2的值" + map.get("2"));
console.log("map集合的长度为:" + map.size());
console.log("map集合是否包含key为1和4:" + map.contains("1") + "," + map.contains("4"));
map.each();

4、结果验证

集合是否为空:true
添加数据成功:1--judy
添加数据成功:2--lucy
添加数据成功:3--lily
集合是否为空:false
查询key为2的值lucy
添加数据成功:2--擎天柱
修改key为2的值为擎天柱
查询key为2的值擎天柱
删除数据成功:2
查询key为2的值undefined
map集合的长度为:2
map集合是否包含key为1和4:true,false
1--judy
3--lily
### 使用 Map 数据结构的方法 #### C++中的`std::map`和`std::unordered_map` 在C++, `std::map` 是一种关联容器,它存储由键值对组成的元素,并自动按照键排序。而 `std::unordered_map` 则不保证任何特定顺序,提供平均情况下常数时间复杂度的查找性能[^1]。 对于这两种映射类型的使用: - 插入元素可以通过下标运算符或者成员函数 `insert()` 完成。 ```cpp #include <iostream> #include <map> int main(){ std::map<int, int> m; m[0] = 1; // 下标方式插入 m.insert({1, 2}); // 成员函数 insert 方式插入 return 0; } ``` - 访问元素同样可以利用下标运算符实现;如果访问不存在的键,则会创建该键并赋予默认值(对于内置类型而言通常是零初始化)。 ```cpp m[key]; // 如果 key 存在则返回对应 value ,否则新建一对 (key,value),其中 value 默认构造 ``` - 删除单个指定键对应的条目可调用 erase 函数 ```cpp m.erase(key); ``` - 遍历整个映射对象可通过迭代器完成 ```cpp for(const auto& p : m){ std::cout << "{" << p.first << ", " << p.second << "}\n"; } ``` #### JavaScript中的`Map` JavaScript 的 ES6 引入了原生支持的 `Map` 对象,允许保存任意类型的键/值对关系。与传统对象不同的是,它可以接受非字符串作为键名,并且保持插入顺序不变[^3]。 创建一个基于已有数组或对象转换来的 `Map` 可以这样做: ```javascript let myArray = [['key1', 'value1'], ['key2', 'value2']]; let mapFromArray = new Map(myArray); // 将 object 转换成 Map const obj = {a: 1, b: 2}; const mapFromObj = new Map(Object.entries(obj)); ``` 设置新项、获取现有项以及删除某一项分别通过 set(), get() 和 delete() 方法处理. ```javascript map.set('key', 'value'); console.log(map.get('key')); // 输出"value" map.delete('key'); // 移除该项 ``` 遍历时可以选择 keys(), values() 或 entries() 来获得不同的视图形式. ```javascript for(let entry of map.entries()){ console.log(entry); // 打印每一对键值组合 } ``` #### Shell脚本中的模拟Map行为 尽管Shell本身并不直接提供像其他高级语言那样的内置映射类型,但是可以通过数组或者其他技巧来模仿这种功能[^4]. 例如,在Bash中可以用关联数组(associative array)来达到目的: ```bash declare -A assoc_array=( ["apple"]="fruit" ["carrot"]="vegetable" ) echo "${assoc_array["apple"]}" # 输出 fruit unset assoc_array["apple"] # 删除 apple 键及其关联值 ``` 需要注意的是,上述例子仅适用于 Bash 版本大于等于 4.x 。而在更早版本或其他 shell 上可能需要采用文件临时存取的方式间接实现类似效果。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

智_永无止境

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值