前言

从经典的 for 循环到 forEach() 方法,用于迭代数据集合的各种技术和方法比比皆是。但是现在比较流行的方法是 .map() 方法。

.map() 通过指定函数调用一个数组中每一项元素,来创建一个新数组。 .map() 是一种 non-mutating(非变异) 方法,它创建一个新数组,而不是只对调用数组进行更改的 mutating(变异) 方法。这可能很难记住。

语法:

array.map(function(currentValue,index,arr), thisValue)

currentValue:必须。当前元素的值

index:可选。当期元素的索引值

arr:可选。当期元素属于的数组对象

thisValue:可选。对象作为该执行回调时使用,传递给函数,用作 "this" 的值。可改变this指向,

map() 方法返回一个新数组,数组中的元素为原始数组元素调用函数处理后的值。

map() 方法按照原始数组元素顺序依次处理元素。

注意:map() 不会对空数组进行检测。

注意:map() 不会改变原始数组。

在这篇文章中,我们将探讨一下 JavaScript 中 .map() 的 4 个值得注意的用法。让我们开始!

在数组中的每一项元素上调用一个函数

将字符串转换为数组

在 JavaScript 库中用于渲染列表

重新格式化数组对象

小技巧使用案例

1. 在数组中的每一项元素上调用一个函数

如前所述,.map() 接受回调函数作为其参数之一,该函数的一个重要参数是由该函数处理的项的当前值。这是一个必需的参数。有了这个参数,我们可以修改数组中的每个单独项,并在其上创建一个新元素。这里有一个例子:

const sweetArray = [2, 3, 4, 5, 35]

const sweeterArray = sweetArray.map(sweetItem => {

return sweetItem * 2

})

console.log(sweetArray) // [2, 3, 4, 5, 35]

console.log(sweeterArray) // [4, 6, 8, 10, 70]

我们可以看到,原数组 sweetArray 并没有被修改,所以 .map() 是一种 non-mutating(非变异) 方法。这里值得一提的是 forEach() 方法,它是遍历数组,对原来的数据操作,会改变原数组。

这甚至可以进一步简化,使其更清洁:

// 创建一个要使用的函数

const makeSweeter = sweetItem => sweetItem * 2;

// 我们有一个数组

const sweetArray = [2, 3, 4, 5, 35];

// 调用我们制作的函数。更具可读性

const sweeterArray = sweetArray.map(makeSweeter);

console.log(sweeterArray); // [4, 6, 8, 10, 70]

拥有像 sweetArray.map(makeSweeter) 这样的代码可以让你在跳转到这段代码时更具可读性。

2.将字符串转换为数组

已知的 .map() 属于 Array 原型。 我们如何使用它将字符串转换为数组。 不用担心,我们不需要再开发一个方法来处理字符串,而是使用特殊的 .call() 方法。

JavaScript 中的所有内容都是对象,方法只是附加到这些对象的函数。 .call() 允许我们利用另一个对象的上下文。 因此,我们将数组中的 .map() 上下文复制到字符串。

.call() 可以传递参数,要使用的上下文和“参数原始函数的参数”。 听起来有点拗口? 这是一个例子:

const name = "Chuloo"

const map = Array.prototype.map

const newName = map.call(name, eachLetter => {

return `${eachLetter}a`

})

console.log(newName) // ["Ca", "ha", "ua", "la", "oa", "oa"]

这里,我们只是在String上使用 .map() 的上下文,并传递了 .map() 所期望的函数参数。 你可以看看控制台里打印出来的内容。

这类似于 String 的 .split() 方法,不过 .split() 方法只能在返回数组之前修改每个单独的字符串字符。

3.在 JavaScript 库中用于渲染列表

像 React 这样的 JavaScript 库利用 .map() 来渲染列表中的项目。这需要 JSX 语法,但是 .map() 方法包含在类似于 mustache 的 JSX 语法中。这是 React 组件的一个很好的例子。

import React from "react";

import ReactDOM from "react-dom";

const names = ["john", "sean", "mike", "jean", "chris"];

const NamesList = () => (

  • {names.map(name =>
  • {name} )}

);

const rootElement = document.getElementById("root");

ReactDOM.render(, rootElement);

如果你不熟悉 React ,那么我告诉这是 React 中的一个简单的无状态组件,它使用列表渲染div。 使用 .map() 渲染单个列表项以迭代最初创建的 names 数组。 此组件使用 ReactDOM 渲染 ID为 root 的 DOM 元素 。

4.重新格式化数组对象

如何处理数组中的对象? .map() 可用于迭代数组中的对象,并以与传统数组类似的方式,修改每个单独对象的内容 并返回一个新数组。 这个修改是基于回调函数中返回的内容来完成的。这里有一个例子:

const myUsers = [

{ name: 'chuloo', likes: 'grilled chicken' },

{ name: 'chris', likes: 'cold beer' },

{ name: 'sam', likes: 'fish biscuits' }

]

const usersByFood = myUsers.map(item => {

const container = {};

container[item.name] = item.likes;

container.age = item.name.length * 10;

return container;

})

console.log(usersByFood);

// [{chuloo: "grilled chicken", age: 60}, {chris: "cold beer", age: 50}, {sam: "fish biscuits", age: 30}]

我们所做的就是使用括号和点符号简单地修改数组中的每个对象。这个用例可以用于在前端应用程序上保存或解析之前处理或压缩接收到的数据。

5.小技巧使用案例

通常情况下,.map() 方法中的 callback 函数只需要接受一个参数,就是正在被遍历的数组元素本身。但这并不意味着 map 只给 callback 传了一个参数。这个思维惯性可能会让我们犯一个很容易犯的错误。 生成新数组元素的 callback 函数,有 三个参数:

currentValue – callback 的第一个参数,数组中正在处理的当前元素,最常用的参数。

index – callback 的第二个参数,数组中正在处理的当前元素的索引。

array – callback 的第三个参数,map 方法被调用的数组。

来看一下例子:

// 下面的语句返回什么呢:

["1", "2", "3"].map(parseInt);

// 你可能觉的会是[1, 2, 3]

// 但实际的结果是 [1, NaN, NaN]

// 通常使用parseInt时,只需要传递一个参数.

// 但实际上,parseInt可以有两个参数.第二个参数是进制数.

// 可以通过语句"alert(parseInt.length)===2"来验证.

// map方法在调用callback函数时,会给它传递三个参数:当前正在遍历的元素,

// 元素索引, 原数组本身.

// 第三个参数parseInt会忽视, 但第二个参数不会,也就是说,

// parseInt把传过来的索引值当成进制数来使用.从而返回了NaN.

function returnInt(element) {

return parseInt(element, 10);

}

['1', '2', '3'].map(returnInt); // [1, 2, 3]

// 意料之中的结果

// 也可以使用简单的箭头函数,结果同上

['1', '2', '3'].map( str => parseInt(str) );

// 一个更简单的方式:

['1', '2', '3'].map(Number); // [1, 2, 3]

// 与`parseInt` 不同,下面的结果会返回浮点数或指数:

['1.1', '2.2e2', '3e300'].map(Number); // [1.1, 220, 3e+300]

还有一个非常实用的小技巧,像 .map() ,.reduce(), .filter() 这些方法支持链式调用。例如:

var myArr = [ 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 ];

var result = myArr

.map(function(element) {

// 数值大于5的数值视为5

if (element > 5)

return 5;

return element;

})

.reduce(function(prev, element) {

// 与之前的数值加总,回传后代入下一轮的处理

return prev + element;

}, 0);

// 40

console.log(result);

这代码看着有点啰嗦是吧?感谢 pythonicx 提供的优化代码:

var myArr = [ 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 ];

let result = myArr.map(m => m>5 ? 5 : m).reduce((x,y) => x+y);

console.log(result); // 40

小结

在这篇文章中,我们研究了 JavaScript 中 .map() 方法的主要用途。 需要注意的是,与其他方法结合使用时,.map() 的函数可以得到强大的扩展和利用。 尝试找出更多用例。

python的array如何使用map_你应该了解的JavaScript Array.map()五种用途小结相关推荐

  1. 初学者学python,列表推导到zip()函数,必须会的五种技巧

    以下即五种实用的小技巧: 字符串运算 列表推导式 lambda 和 map() 单行条件语句 zip() 字符串运算 字符串本质上也是一种元组,但是字符串有很多「运算」方式. 最直观的是字符串的 + ...

  2. python函数可以提高代码执行速度吗_Python代码运行速度慢?这五种方法很管用

    对于Python很多人还是比较了解的,虽然说Python有很多优势但同样具有劣势,Python最大的劣势就是运行效率慢,那么如何提高Python代码运行速度呢?这五种方法很管用. 1.PyPy:在选择 ...

  3. python和c混编_python与C、C++混编的四种方式(小结)

    混编的含义有两种, 一种是在python里面写C 一种是C里面写python 本文主要是进行简化,方便使用. ############################################# ...

  4. [ Typescript 手册] JavaScript `Array` 在 Typescript 中的接口

    [ Typescript 手册] JavaScript `Array` 在 Typescript 中的接口 本文地址:https://blog.csdn.net/qq_28550263/article ...

  5. python中的array是什么意思_python中数组(numpy.array)的基本操作

    为什么要用numpy Python中提供了list容器,可以当作数组使用.但列表中的元素可以是任何对象,因此列表中保存的是对象的指针,这样一来,为了保存一个简单的列表[1,2,3].就需要三个指针和三 ...

  6. python读excel 包含格式_python里读写excel等数据文件的几种常用方式

    python处理数据文件第一步是要读取数据,文件类型主要包括文本文件(csv.txt等).excel文件.数据库文件.api等. 下面整理下python有哪些方式可以读取数据文件. 1. python ...

  7. python最快的循环方法_【转】【Python效率】五种Pandas循环方法效率对比

    [Python效率]五种Pandas循环方法效率对比 - 文兄的文章 - 知乎 https://zhuanlan.zhihu.com/p/80880493 正文: 如果你使用过Python及Panda ...

  8. python list方法说明_对python中list的五种查找方法说明

    Python中是有查找功能的,五种方式:in.not in.count.index,find 前两种方法是保留字,后两种方式是列表的方法. 下面以a_list = ['a','b','c','hell ...

  9. 循环下标_【转】【Python效率】五种Pandas循环方法效率对比

    [Python效率]五种Pandas循环方法效率对比 - 文兄的文章 - 知乎 https://zhuanlan.zhihu.com/p/80880493 正文: 如果你使用过Python及Panda ...

最新文章

  1. react 渲染道具_关于React道具的另一篇文章
  2. 重构机房收费系统你要用的——异常处理和抛出异常(try catch finally)——(vb.net)...
  3. Spring bean相关
  4. 【Qt】2D绘图之坐标系统
  5. windows平台下vlc编译
  6. c#官方推荐md5通用加密类
  7. Mysql锁定表/解锁句法
  8. 为什么滴滴天猫都玩上了大数据“杀熟”的套路?
  9. 浅析python中的main函数_浅组词_浅的多音字组词,浅是多音字吗,浅组词有哪些
  10. python面试题:python计算股票收益最大化
  11. VBA笔记 退出循环、Sub、Fuction等的Exit语句
  12. 为大家提供了解内网穿透的内容
  13. 2020华师大个人考研总结
  14. c语言求成绩中的最高分辨率大约是,一级msoffice全真机试试卷.docx
  15. 计算机与资源管理器有何区别,资源管理器与我的电脑有什么不同.PPT
  16. MATLAB三维数组转为二维数组(时间序列分析中很有用)
  17. 宝德银河麒麟系统打印机安装及共享方法(二)
  18. C里面recipe for target failed报错
  19. 动态规划强盗抢劫Java实现
  20. maven 打包时异常 <找不到符号 [ERROR] 符号: 方法>

热门文章

  1. LeetCode——350. 两个数组的交集 II
  2. LeetCode450题—— 删除二叉搜索树中的节点
  3. 自适应阈值算法(大津阈值法)
  4. python绘制社会关系网络图_Python networkx 网络图绘制
  5. c# 低功耗蓝牙_c# - 如何使用C#手动绑定到WinForm中的蓝牙低能耗设备? - 堆栈内存溢出...
  6. php表白情话,朋友圈唯美表白短句情话 适合发朋友圈的情话
  7. 鸿蒙空间是什么星辰变,飞升之后做什么《星辰变》神魔妖界收伏奇珍异兽
  8. php 留言板项目 ajax,PHP Ajax留言板
  9. 雨林木风win11 64位全新专业版系统v2021.08
  10. 火狐浏览器如何更改字体 火狐浏览器字体更改方法分享