JS进阶-数组map用法

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 ' '
        }; 
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值