map() 方法可以遍历数组处理数据,并且返回新的数组
map也称为映射。映射是个术语,指两个元素的集之间元素相互“对应”的关系。
map重点在于有返回值,forEach没有返回值
语法
array.map(callback(currentValue[,index[,array]])[,thisArg])
callback :表示对数组中的每个元素要执行的函数。该函数包含三个参数:
currentValue:表示正在处理的当前元素。
index:可选参数,表示正在处理的当前元素的索引。
array:可选参数,表示正在处理的当前数组。thisArg:可选参数,表示执行 callback 函数时的 this 值。
需要注意的是,在使用 map()
方法时,我们可以选择传递可选参数 thisArg
来设置回调函数的 this
值。如果不传递 thisArg
参数,则默认情况下,回调函数的 this
值为undefined
。
let numbers = [1, 2, 3];
let obj = { multiplier: 2 };
let doubled = numbers.map(function(num) {
return num * this.multiplier;
}, obj);
console.log(doubled); // 输出 [2, 4, 6]
应用
•使用 map()
方法将数组中的数字乘以 2 并返回新的数组
let numbers = [1, 2, 3, 4];
let doubled = numbers.map(function(num) {
return num * 2;
});
console.log(doubled); // 输出 [2, 4, 6, 8]
•将对象数组转换为属性值数组
let objects = [{ name: 'apple', color: 'red' }, { name: 'banana', color: 'yellow' }, { name: 'orange', color: 'orange' }];
let colors = objects.map(function(obj) {
return obj.color;
});
console.log(colors); // 输出 ["red", "yellow", "orange"]
•去重
const arr = [1, 2, 2, 3, 4, 4, 5];
const newArr = Array.from(new Map(arr.map(item => [item, item])).values());
console.log(newArr); // [1, 2, 3, 4, 5]
这段代码的原理是,先使用map
方法将数组元素映射为键值对的数组。然后使用Map
构造函数将键值对数组转换为Map
对象,其中键和值均为数组的元素。由于Map
对象中键是唯一的,这样就自动去除了数组中的重复项。最后,通过Array.from()
方法将去重后的Map
对象的值转换为新的数组。
• 寻找重复数
给定一个包含 n + 1 个整数的数组 nums ,其数字都在 [1, n] 范围内(包括 1 和 n),可知至少存在一个重复的整数。
假设 nums 只有 一个重复的整数 ,返回 这个重复的数 。
你设计的解决方案必须 不修改 数组 nums 且只用常量级 O(1) 的额外空间。
var findDuplicate = function (nums) {
var mymap = new Map()
// 遍历数组,得到一个mymap
for (var k of nums) {
// mymap.has(k) ? mymap.set(k, mymap.get(k) + 1) : mymap.set(k, 1)
mymap.set(k, (mymap.get(k) || 0) + 1)
}
console.log(mymap)
// 遍历mymap找出出现2次的数
for (let [key, val] of mymap.entries()) {
if (val == 2) return key;
}
// for (let [key, val] of mymap) {
// if (val==2) return key;
// }
};
var res = findDuplicate([1, 3, 4, 3, 2])
console.log(res);
•寻找字符串中第一个只出现1次的字符
在字符串s中找出第一个只出现一次的字符。若没有,返回一个单空格。s只包含小写字母。
// **************************题2方法1*******************
var firstUniqChar = function (s) {
let map = new Map();
// 1.统计每个字符出现的次数
for (let i of s) {
if (!map.has(i)) {
map.set(i, 1)
} else {
map.set(i, map.get(i) + 1)
}
}
// 2.返回出现次数为1的即可
for (let i of s) {
if (map.get(i) === 1) {
return i
}
}
return ' '
};
// **************************题2方法2*******************
var firstUniqChar = function (s) {
if (!s) { return " " }
else {
var obj = {}
for (var k in s) {
//obj[s[k]] ? obj[s[k]]++ : obj[s[k]] = 1
// 方法2:
// obj[s[k]]=(obj[s[k]] || 0) + 1
// 方法3:
// 键值对应数没有值,赋1
if (obj[s[k]] == undefined) {
obj[s[k]] = 1;
} else {
// 有值,归零
obj[s[k]] = 0;
}
}
for (var j in obj) {
while (obj[j] === 1) {
return j
}
}
};
}
// **************************题2方法3*******************
var firstUniqChar = function (s) {
var map = new Map();
for (let i = 0; i < s.length; i++) {
var cur = s.charAt(i);
if (map.has(cur)) {
map.set(cur, false);
} else {
map.set(cur, true);
}
}
for (let [key, value] of map) {
if (value) {
return key;
}
}
return ' '
};