当前位置: 首页 > news >正文

电子商务网站设计淘宝运营培训班哪里有

电子商务网站设计,淘宝运营培训班哪里有,郑州微信小程序开发公司排名,WordPress 百度分享代码在 JavaScript 中,map 这个词确实可能引起混淆,因为它有两种不同的含义: ​数组的 map() 方法:这是数组的一个高阶函数,用于转换数组元素​Map 集合类型:这是 ES6 引入的一种新的集合类型,用于…

在 JavaScript 中,map 这个词确实可能引起混淆,因为它有两种不同的含义:

  1. 数组的 map() 方法:这是数组的一个高阶函数,用于转换数组元素
  2. Map 集合类型:这是 ES6 引入的一种新的集合类型,用于存储键值对

一、JavaScript 中数组里的 map 方法

map() 是 JavaScript 数组(Array)的一个内置方法,它创建一个新数组,其结果是该数组中的每个元素调用一次提供的函数后的返回值。

基本语法

const newArray = arr.map(callback(currentValue[, index[, array]]) {// 返回新数组的元素
}[, thisArg]);

参数说明

  • callback:生成新数组元素的函数,接收三个参数:
    • currentValue:当前正在处理的元素
    • index(可选):当前元素的索引
    • array(可选):调用map的数组
  • thisArg(可选):执行callback时使用的this

特点

  1. 不改变原数组map方法不会改变原数组,而是返回一个新数组
  2. 遍历范围:在第一次调用callback之前会确定数组的范围,之后添加到数组中的元素不会被callback访问到
  3. 跳过空位:如果数组是稀疏的(有空白元素),map会跳过这些空位

示例

基本使用

const numbers = [1, 2, 3];
const doubled = numbers.map(num => num * 2);
console.log(doubled); // [2, 4, 6]

使用索引参数

const numbers = [1, 2, 3];
const squaredWithIndex = numbers.map((num, index) => num * index);
console.log(squaredWithIndex); // [0, 2, 6]

处理对象数组

const users = [{ name: 'Alice', age: 25 },{ name: 'Bob', age: 30 },{ name: 'Charlie', age: 35 }
];const names = users.map(user => user.name);
console.log(names); // ['Alice', 'Bob', 'Charlie']

使用 thisArg

const obj = {multiplier: 10,calculate: function(arr) {return arr.map(function(num) {return num * this.multiplier;}, this);}
};console.log(obj.calculate([1, 2, 3])); // [10, 20, 30]

与 forEach 的区别

  • map 返回一个新数组,而 forEach 不返回值(返回 undefined
  • map 适用于需要基于原数组创建新数组的场景,forEach 适用于仅需要遍历数组执行操作的场景

注意事项

  1. 如果回调函数没有返回值,新数组将填充 undefined
  2. 对于稀疏数组,空元素会被跳过,但新数组仍会保持相同的长度
  3. 对于大型数组,map 可能会比手动循环慢一些,因为需要创建新数组

map 是函数式编程中常用的方法,可以使代码更简洁、更易读。

二、Map集合类型

Map 是 ES6 (ECMAScript 2015) 引入的一种新的集合类型,用于存储键值对(key-value pairs)。它类似于对象(Object),但有以下几个重要区别:

基本特性

  1. 键的类型:Map 的键可以是任意值(包括对象、函数等),而普通对象的键只能是字符串或 Symbol
  2. 顺序保证:Map 会记住键的原始插入顺序
  3. 大小获取:可以直接通过 .size 属性获取 Map 中的元素数量
  4. 性能优化:在频繁增删键值对的场景下表现更好

基本用法

创建 Map

// 创建一个空 Map
const map = new Map();// 通过二维数组初始化
const map2 = new Map([['name', 'Alice'],['age', 25],[1, 'number one']
]);

最常用的三个方法

1.map.set(key, value)

作用:向 Map 中添加或更新一个键值对。
参数

  • key:可以是任意类型(数字、字符串、对象等)。
  • value:任意值(数字、字符串、数组、对象等)。

示例

const map = new Map();
map.set('name', 'Alice');  // 添加键值对 'name' → 'Alice'
map.set(123, { age: 25 }); // 添加键值对 123 → { age: 25 }
map.set('name', 'Bob');    // 更新 'name' 的值为 'Bob'

特点

  • 如果 key 已存在,set() 会覆盖旧值。
  • 键可以是任意类型(普通对象的键只能是字符串或 Symbol)。

2. map.get(key)

作用:获取指定 key 对应的 value
参数

  • key:要查找的键。

返回值

  • 如果 key 存在,返回对应的 value
  • 如果 key 不存在,返回 undefined

const map = new Map();
map.set('name', 'Alice');console.log(map.get('name')); // 输出 'Alice'
console.log(map.get('age'));  // 输出 undefined

用途

  • 在 "两数之和" 问题中,map.get(complement) 用于快速获取补数的索引。

3. map.has(key)

作用:检查 Map 中是否存在指定的 key
参数

  • key:要检查的键。

返回值

  • true(如果 key 存在)。
  • false(如果 key 不存在)。
const map = new Map();
map.set('name', 'Alice');console.log(map.has('name')); // 输出 true
console.log(map.has('age'));  // 输出 false

用途

  • 在 "两数之和" 问题中,map.has(complement) 用于快速判断补数是否存在。

三者的关系

方法用途返回值时间复杂度
set()添加/更新键值对返回整个 Map(可链式调用)O(1)
get()获取指定 key 的 valuevalue 或 undefinedO(1)
has()检查 key 是否存在true 或 falseO(1)

    添加/获取元素

    const map = new Map();// 添加元素
    map.set('name', 'Alice');
    map.set(1, 'number one');
    map.set({}, 'object key');// 获取元素
    console.log(map.get('name')); // 'Alice'
    console.log(map.get(1));      // 'number one'

    检查键是否存在

    console.log(map.has('name')); // true
    console.log(map.has('nonexistent')); // false

    删除元素

    map.delete('name'); // 删除指定键
    map.clear(); // 清空整个 Map

    获取大小

    console.log(map.size); // 返回 Map 中键值对的数量

    遍历 Map

    Map 提供了多种遍历方式:

    const map = new Map([['name', 'Alice'],['age', 25],['job', 'developer']
    ]);// 1. for...of 遍历
    for (const [key, value] of map) {console.log(key, value);
    }// 2. forEach 方法
    map.forEach((value, key) => {console.log(key, value);
    });// 3. 获取键、值或条目的迭代器
    console.log([...map.keys()]);    // ['name', 'age', 'job']
    console.log([...map.values()]);  // ['Alice', 25, 'developer']
    console.log([...map.entries()]); // 同直接迭代 Map

    Map 与 Object 的比较

    特性MapObject
    键的类型任意值字符串或 Symbol
    顺序按插入顺序不保证顺序
    大小通过 .size 获取需要手动计算
    默认属性有原型链属性
    性能频繁增删时更优一般情况更优
    序列化不能直接 JSON.stringify可以直接序列化

    使用场景

    1. 需要非字符串键时

      const objKey = {};
      const map = new Map();
      map.set(objKey, 'value for object');
    2. 需要保持插入顺序时

      const map = new Map();
      map.set('a', 1);
      map.set('b', 2);
      map.set('c', 3);
      // 遍历时会保持 a → b → c 的顺序
    3. 频繁增删键值对时

      // Map 在频繁增删时性能更好
      for (let i = 0; i < 1000; i++) {map.set(i, i * 2);if (i % 2 === 0) map.delete(i / 2);
      }
    4. 需要避免属性冲突时

      // 不会意外访问到原型上的属性
      const map = new Map();
      map.set('toString', 'custom toString');
      // 不会调用 Object.prototype.toString

    注意事项

    1. Map 的键比较是基于 "SameValueZero" 算法:

      • NaN 被视为等于 NaN(尽管 NaN !== NaN
      • -0 和 +0 被视为相等
      • 其他值使用严格相等比较 (===)
    2. 对象作为键时,只有引用相同才会被视为同一个键:

      const obj1 = {};
      const obj2 = {};
      map.set(obj1, 'value1');
      map.set(obj2, 'value2');
      console.log(map.get(obj1)); // 'value1'
      console.log(map.get(obj2)); // 'value2'
    3. Map 不能被直接序列化为 JSON,需要先转换为数组:

      const map = new Map([['a', 1], ['b', 2]]);
      const jsonStr = JSON.stringify([...map]);

    Map 为 JavaScript 提供了一种更灵活、更强大的键值存储机制,特别适合需要复杂键或需要保持插入顺序的场景。

    三、两数之和

    1. 两数之和

     

    给定一个整数数组 nums 和一个整数目标值 target,请你在该数组中找出 和为目标值 target  的那 两个 整数,并返回它们的数组下标。

    你可以假设每种输入只会对应一个答案,并且你不能使用两次相同的元素。

    你可以按任意顺序返回答案。

    示例 1:

    输入:nums = [2,7,11,15], target = 9
    输出:[0,1]
    解释:因为 nums[0] + nums[1] == 9 ,返回 [0, 1] 。
    

    示例 2:

    输入:nums = [3,2,4], target = 6
    输出:[1,2]
    

    示例 3:

    输入:nums = [3,3], target = 6
    输出:[0,1]
    

    提示:

    • 2 <= nums.length <= 104
    • -109 <= nums[i] <= 109
    • -109 <= target <= 109
    • 只会存在一个有效答案

    方法一:暴力枚举法(不推荐)

    /*** @param {number[]} nums* @param {number} target* @return {number[]}*/
    var twoSum = function (nums, target) {let arr = [];for (let i = 0; i < nums.length; i++) {for (let j = i + 1; j < nums.length; j++) {if (nums[i]+nums[j] === target) {arr.push(i);arr.push(j);}}}return arr
    };

    方法二:哈希表法(推荐)

    map()设置为当前数组,索引:map.set(nums[i], i);

    has检查值。get检查索引。

    var twoSum = function(nums, target) {// 1. 创建一个空的哈希表(Map)来存储数字和它们的索引const map = new Map();// 2. 遍历数组中的每个数字for (let i = 0; i < nums.length; i++) {// 3. 计算当前数字所需的"补数"(即target - 当前数字)const complement = target - nums[i];// 4. 检查这个补数是否已经在哈希表中存在if (map.has(complement)) {// 5. 如果存在,返回补数的索引和当前数字的索引return [map.get(complement), i];}// 6. 如果不存在,把当前数字和它的索引存入哈希表map.set(nums[i], i);}// 7. 如果没有找到符合条件的两个数,返回空数组return [];
    };

    步骤解析

    1. map.has(complement):检查需要的补数是否之前出现过。
    2. map.get(complement):如果补数存在,获取它的索引。
    3. map.set(nums[i], i):将当前数字和索引存入 Map

    也可以用数组 通过includes判断是否有这个数,通过indexOf返回下表

    var twoSum = function(nums, target) {const arr = new Array();for (let i = 0; i < nums.length; i++) {const complement = target - nums[i];if (arr.includes(complement)) {return [arr.indexOf(complement), i];}arr.push(nums[i])}return [];
    };

    但是 问题依然存在

    • includes() 仍然是 ​O(n),整体时间复杂度 ​O(n²)
    • 需要额外维护 indexMap,不如直接用 Map 简洁高效。

    为什么推荐 Map 而不是数组?

    操作数组 (Array)哈希表 (Map)优势
    检查存在includes() (O(n))has() (O(1))Map 快 100 倍+
    获取索引indexOf() (O(n))get() (O(1))Map 直接存储索引

    数组 vs Map 的对比

    操作数组 (Array)Map问题
    检查值是否存在arr.includes(x)(O(n) 遍历)map.has(x)(O(1) 哈希查找)数组慢
    获取值的索引arr.indexOf(x)(O(n) 遍历)map.get(x)(O(1) 直接拿索引)数组慢
    存储数据arr.push(x)(只能存值,无索引映射)map.set(num, index)(存值+索引)

    数组无法高效存索引

    处理重复值需要额外逻辑天然支持Map 更简洁

    方法三:排序+双指针法(特定场景适用)

    function twoSum(nums, target) {const sorted = nums.map((num, index) => ({ num, index })).sort((a, b) => a.num - b.num);let left = 0, right = sorted.length - 1;while (left < right) {const sum = sorted[left].num + sorted[right].num;if (sum === target) {return [sorted[left].index, sorted[right].index].sort();} else if (sum < target) {left++;} else {right--;}}return [];
    }

    四、四数相加

    454. 四数相加 II

     

    给你四个整数数组 nums1nums2nums3nums4 ,数组长度都是 n ,请你计算有多少个元组 (i, j, k, l) 能满足:

    • 0 <= i, j, k, l < n
    • nums1[i] + nums2[j] + nums3[k] + nums4[l] == 0

    示例 1:

    输入:nums1 = [1,2], nums2 = [-2,-1], nums3 = [-1,2], nums4 = [0,2]
    输出:2
    解释:
    两个元组如下:
    1. (0, 0, 0, 1) -> nums1[0] + nums2[0] + nums3[0] + nums4[1] = 1 + (-2) + (-1) + 2 = 0
    2. (1, 1, 0, 0) -> nums1[1] + nums2[1] + nums3[0] + nums4[0] = 2 + (-1) + (-1) + 0 = 0
    

    示例 2:

    输入:nums1 = [0], nums2 = [0], nums3 = [0], nums4 = [0]
    输出:1
    

      提示:

    • n == nums1.length
    • n == nums2.length
    • n == nums3.length
    • n == nums4.length
    • 1 <= n <= 200
    • -228 <= nums1[i], nums2[i], nums3[i], nums4[i] <= 228
    /*** @param {number[]} nums1* @param {number[]} nums2* @param {number[]} nums3* @param {number[]} nums4* @return {number}*/
    var fourSumCount = function(nums1, nums2, nums3, nums4) {const twoSumMap = new Map();let count = 0;// 统计nums1和nums2数组元素之和for(let n1 of nums1){for(let n2 of nums2){const sum=n1+n2;twoSumMap.set(sum, (twoSumMap.get(sum) || 0) + 1)}}// 找到如果 0-(c+d) 在map中出现过的话,就把map中key对应的value也就是出现次数统计出来for(const n3 of nums3) {for(const n4 of nums4) {const sum = n3 + n4;count += (twoSumMap.get(0 - sum) || 0)}}return count;
    };

     

    http://www.cadmedia.cn/news/2051.html

    相关文章:

  1. 河南省电力工程建设企业协会网站seo关键词排名优化方法
  2. 建设政府网站的作用中国足彩网竞彩推荐
  3. 小型广告公司简介模板seo优化按天扣费
  4. 网站怎么做图片搜索网络广告策划流程有哪些?
  5. 郑州网站建设维护百度下载app安装
  6. 百度录入网站推广普通话宣传内容
  7. 找生意做去哪个网站网店推广策划书
  8. 动画设计师招聘苏州手机关键词优化
  9. 信息公司网站建设方案 游戏北京seo薪资
  10. 怎么制作网站视频网页百度网盘
  11. wap网站建设哪家好在百度上打广告找谁
  12. 哈尔滨网站开发渠道成人英语培训班哪个机构好
  13. 进入网站后台管理系统泰安做网站公司
  14. 相馆网站建设费用预算网站seo推广seo教程
  15. b2b网站的站外推广该如何做广州四楚seo顾问
  16. 长春关键词优化平台seo关键词排优化软件
  17. 网页翻译不见了seo优化百度技术排名教程
  18. 潍坊建设网站的公司电话成都今天宣布的最新疫情消息
  19. 网站建好了怎么做才赚钱企业培训心得体会
  20. 如何最便宜建设一个网站新品牌推广方案
  21. 遵义高端网站建设广州头条今日头条新闻
  22. 南通网站建设案例百度怎样免费发布信息
  23. 网站底部备案代码百度提交
  24. 服务器托管公司seo外链发布平台有哪些
  25. 深圳住建官网杭州seo服务公司
  26. 安徽外经建设集团网站sem
  27. 北京市朝阳区住房建设网站产品软文范例软文
  28. 预付做网站定金如何东莞做网站推广公司
  29. 盾思途旅游网站建设全球网站排名
  30. 企业手机网站建设流程图怎样建立个人网站