整合营销服务商

电脑端+手机端+微信端=数据同步管理

免费咨询热线:

24 个 JavaScript 循环遍历方法,你都知

24 个 JavaScript 循环遍历方法,你都知道吗?

天我们来看点基础知识,看看JavaScript中的那些循环遍历方法:

一、数组遍历方法

1. forEach()

forEach 方法用于调用数组的每个元素,并将元素传递给回调函数。数组中的每个值都会调用回调函数。其语法如下:

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

该方法的第一个参数为回调函数,是必传的,它有三个参数:

  • currentValue:必需。当前元素
  • index:可选。当前元素的索引值。
  • arr:可选。当前元素所属的数组对象
let arr=[1,2,3,4,5]
arr.forEach((item, index, arr)=> {
  console.log(index+":"+item)
})

该方法还可以有第二个参数,用来绑定回调函数内部this变量(前提是回调函数不能是箭头函数,因为箭头函数没有this):

let arr=[1,2,3,4,5]
let arr1=[9,8,7,6,5]
arr.forEach(function(item, index, arr){
  console.log(this[index])  //  9 8 7 6 5
}, arr1)

注意:

  • forEach 方法不会改变原数组,也没有返回值;
  • forEach无法使用 break,continue 跳出循环,使用 return 时,效果和在 for 循环中使用 continue 一致;
  • forEach 方法无法遍历对象,仅适用于数组的遍历。

2. map()

map() 方法会返回一个新数组,数组中的元素为原始数组元素调用函数处理后的值。该方法按照原始数组元素顺序依次处理元素。其语法如下:

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

该方法的第一个参数为回调函数,是必传的,它有三个参数:

  • currentValue:必须。当前元素的值;
  • index:可选。当前元素的索引值;
  • arr:可选。当前元素属于的数组对象。
let arr=[1, 2, 3];
 
arr.map(item=> {
    return item + 1;
})

// 输出结果: [2, 3, 4]

该方法的第二个参数用来绑定参数函数内部的this变量,是可选的:

let arr=['a', 'b', 'c'];
 
[1, 2].map(function (e) {
    return this[e];
}, arr)

// 输出结果: ['b', 'c']

该方法还可以进行链式调用:

let arr=[1, 2, 3];
 
arr.map(item=> item + 1).map(item=> item + 1)

// 输出结果: [3, 4, 5]

注意:

  • map 方法不会对空数组进行检测;
  • map 方法遍历数组时会返回一个新数组,不会改变原始数组
  • map 方法有返回值,可以return出来,map的回调函数中支持return返回值;
  • map 方法无法遍历对象,仅适用于数组的遍历。

3. for of

for...of 语句创建一个循环来迭代可迭代的对象。在 ES6 中引入的 for...of 循环,以替代 for...inforEach() ,并支持新的迭代协议。其语法如下:

for (variable of iterable) {
    statement
}

该方法有两个参数:

  • variable:每个迭代的属性值被分配给该变量。
  • iterable:一个具有可枚举属性并且可以迭代的对象。

该方法可以获取数组的每一项:

let arr=[
    {id:1, value:'hello'},
    {id:2, value:'world'},
    {id:3, value:'JavaScript'}
]
for (let item of arr) {
  console.log(item); 
}
// 输出结果:{id:1, value:'hello'}  {id:2, value:'world'} {id:3, value:'JavaScript'}

注意:

  • for of 方法只会遍历当前对象的属性,不会遍历其原型链上的属性;
  • for of 方法适用遍历 数组/ 类数组/字符串/map/set 等拥有迭代器对象的集合;
  • for of 方法不支持遍历普通对象,因为其没有迭代器对象。如果想要遍历一个对象的属性,可以用 for in 方法;
  • 可以使用break、continue、return来中断循环遍历;

4. filter()

filter()方法用于过滤数组,满足条件的元素会被返回。它的参数是一个回调函数,所有数组元素依次执行该函数,返回结果为true的元素会被返回,如果没有符合条件的元素,则返回空数组。其语法如下:

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

该方法的第一个参数为回调函数,是必传的,它有三个参数:

  • currentValue:必须。当前元素的值;
  • index:可选。当前元素的索引值;
  • arr:可选。当前元素属于的数组对象。
const arr=[1, 2, 3, 4, 5]
arr.filter(item=> item > 2) 

// 输出结果:[3, 4, 5]

同样,它也有第二个参数,用来绑定参数函数内部的this变量。

可以使用filter()方法来移除数组中的undefined、null、NAN等值:

let arr=[1, undefined, 2, null, 3, false, '', 4, 0]
arr.filter(Boolean)

// 输出结果:[1, 2, 3, 4]

注意:

  • filter 方法会返回一个新的数组,不会改变原数组;
  • filter 方法不会对空数组进行检测;
  • filter 方法仅适用于检测数组。

5. some()、every()

some() 方法会对数组中的每一项进行遍历,只要有一个元素符合条件,就返回true,且剩余的元素不会再进行检测,否则就返回false。

every() 方法会对数组中的每一项进行遍历,只有所有元素都符合条件时,才返回true,如果数组中检测到有一个元素不满足,则整个表达式返回 false ,且剩余的元素不会再进行检测。其语法如下:

两者的语法如下:

array.some(function(currentValue,index,arr),thisValue)
array.every(function(currentValue,index,arr), thisValue)

两个方法的第一个参数为回调函数,是必传的,它有三个参数:

  • currentValue:必须。当前元素的值;
  • index:可选。当前元素的索引值;
  • arr:可选。当前元素属于的数组对象。
let arr=[1, 2, 3, 4, 5]
arr.some(item=> item > 4) 

// 输出结果:true

let arr=[1, 2, 3, 4, 5]
arr.every(item=> item > 0) 

// 输出结果:true

注意:

  • 两个方法都不会改变原数组,会返回一个布尔值;
  • 两个方法都不会对空数组进行检测;
  • 两个方法都仅适用于检测数组。

6. reduce()、reduceRight()

reduce() 方法接收一个函数作为累加器,数组中的每个值(从左到右)开始缩减,最终计算为一个值。reduce() 可以作为一个高阶函数,用于函数的 compose。其语法如下:

array.reduce(function(total, currentValue, currentIndex, arr), initialValue)

reduce 方法会为数组中的每一个元素依次执行回调函数,不包括数组中被删除或从未被赋值的元素,回调函数接受四个参数:

  • total:上一次调用回调返回的值,或者是提供的初始值(initialValue);
  • currentValue:当前被处理的元素;
  • currentIndex:当前元素的索引;
  • arr:当前元素所属的数组对象。

该方法的第二个参数是 initialValue,表示传递给函数的初始值 (作为第一次调用 callback 的第一个参数):

let arr=[1, 2, 3, 4]
let sum=arr.reduce((prev, cur, index, arr)=> {
    console.log(prev, cur, index);
    return prev + cur;
})
console.log(arr, sum);

输出结果:

大家好,我是小雨!

今天我们要介绍的知识点是 Django 中的 Templates,它也是 MVT 结构中的 T,Templates 可以叫它模板。Templates 究竟用来做什么,通过这一节的介绍,希望大家有一个基本的了解。

一、Templates 模板

在上一节当中,我们在浏览器中看到的是 HTTPResponse 返回的字符串,而这一节我们讲的 templates 最直接的功能是把前端的 html 页面显示出来,这样用户就能看到清晰美观的界面。那么 Django 是如何加载 html 网页的呢?下面介绍两种方式:

1.使用 render_to_string 加载 html

我们提前准备好一个 html 页面index.html,然后为了方便 views 中能成功访问到这个index.html,需要在settings.py中将templates文件夹的路径声明清楚。在 TEMPLATES 列表字典的DIRS属性下添加一下内容:

os.path.join(BASE_DIR, 'templates')  # 如果缺少os模块记得导入

render_to_string 的使用方法: 先使用from django.templates.loader import render_to_string导入模块,然后给 render_to_string 传入 html 文件后,最后将其以 HttpResponse 的方式返回出去即可。

from django.http import HttpResponse
from django.templates.loader import render_to_string

def index(request):
    html = render_to_string("index.html")
    return HttpResponse(html)

2. 使用 render 加载 html

这里我们需要从django.shortcut导入 render 模块,一般情况下 Django 会默认导入这个模块,views 中如果没有的话就手动导入一下:

from django.shortcut import render

接着 render 中传入 html 文件,记得添加 request 参数,然后使用 return 返回 render 即可:

def index(request):
    return render(request,'index.html')

最后记得在 urls.py 中将路径对应的 views.index 添加进来就可以了。

二、模板语言的基本使用

我们要知道 templates 作为 MVT 架构中的 T,不仅仅是加载前端中的页面,它还包含一种模板语言,能够在 htmlL 语言中实现逻辑控制(条件选择、循环),相对于 JavaScript 会更加的灵活。

常用的python模板语言引擎

接下来,我们就以一个简单的例子来介绍 Django 模板语言的使用。

1.功能需求分析

我们有一个存储学生信息的Students.csv文件,包含了学号、姓名、性别、手机号码、出生日期、电子邮箱等信息。

319001,赵一,男,1998/12/27,18706012232,532211428@qq.com,北京市海淀区颐和园路5号,342622199801144314,2019/9/1,计算机,赵一,13655512212
319002,钱二,女,1995/10/25,13459732456,572501101@qq.com,北京市海淀区双清路30号,342622199709066819,2019/9/1,物联网,王二,13856909992

这里数据其实有很多条,为了减少篇幅我们就罗列出两条。

现在需要将这些数据加载到前端的 html 页面中,通过 tabel 标签显示出来。

2. 实现过程

(1)准备

首先用 pycharm 新建一个 Django 项目,为了方便使用直接把 application 和 templates 文件夹都建好。

pycharm新建Django项目

在 templates 中新建一个 index.html 文件,写好用于显示学生信息的标题以及表格框架。

<div id="title">学生信息列表</div>
<div id="table_main">
    <table border="1">
        <thead>
            <tr>
                <th>学号</th>
                <th>姓名</th>
                <th>性别</th>
                <th>出生日期</th>
                <th>手机号码</th>
                <th>电子邮箱</th>
                <th>家庭地址</th>
            </tr>
        </thead>
        <tbody>
        </tbody>
    </table>
</div>

(2)views 设置

为了读取 csv 文件,写一个read_form_file方法,将文件中的信息存储在 Students 列表中。

def read_from_file(path:str):
    students = []
    try:
        with open(path, mode="r", encoding="UTF-8") as fd:
            # 读取当前行
            current_line = fd.readline()
            # 判断当前行是否为空
            while current_line:
                temp_line = current_line.split(",")
                students.append(temp_line)
                current_line = fd.readline()
        return students
    except Exception as e:
        raise e

接下来,我们定义一个 student 方法,用来显示 html 内容给前端,这里面我们还是使用 render 将获取的数据传递给前端页面index.html

注意使用 context 参数,它的值我们设置为一个字典,键设置为 DTL 模板语言中要引用的变量,值设置为本地获取的数据

def student(request):
    students = read_from_file(r"D:\Python\Project\Demo\Student.csv")
    return render(request, "index.html", context={"all_student":students})

(3)DTL 模板语言

index.html中,表格内容的填充,我们通过 DTL 模板语言来完成。在 HTML 代码中要插入 DTL 模板语言,需要使用{%语句%},for 语句还要使用{% endfor %}来结尾,在语句内部调用变量列表中的元素也是直接使用变量名.数字并且需要包裹两层大括号。这里我们以循环输出 student 列表中的各个元素为例,其 DTL 模板语言的写法如下:

 {% for student in all_student %}
    <tr>
    <td>{{ student.0 }}</td>
    <td>{{ student.1 }}</td>
    <td>{{ student.2 }}</td>
    <td>{{ student.3 }}</td>
    <td>{{ student.4 }}</td>
    <td>{{ student.5 }}</td>
    <td>{{ student.6 }}</td>
    </tr>
 {% endfor %}

(4)urls 配置

接下来配置路由,添加 student 路径

path('student/',app01_views.student),

(5)运行效果

一切准备就绪后,执行python manage.py runserver,在浏览器中打开127.0.0.1:8000/student效果如下:

数据被成功加载

三、加载静态文件

1. 什么是静态文件

不能与服务器做动态交互的文件叫静态文件; 对于 HTML 中的图片、视频、css、js 这些都属于静态文件。Django 对于这些文件有一套明确的管理机制。 如果我们只遵循 HTML 的规范去加载静态文件,在 Django 中是显示不出来的。

Django无法加载静态文件

2. 如何加载静态文件

为了解决这个问题,我们首先要确保配置文件 settings.py 中 INSTALLED_APP 下静态文件模块有被加载到:

'django.contrib.staticfiles',  # 必须确保安装静态模块

然后使用STATICFILES_DIRS这个全局变量来存储静态文件的路径。

STATICFILES_DIRS = [
    os.path.join(BASE.DIR, 'static'),
]

然后在 html 中开始加上模板语言,如果让 html 引用静态文件,那就需要先导入静态模块。在 html 语句第一行写上

{% load static %}

对于要引用静态图片的标签路径使用{% static "路径文件名 "%},如:

<img src="{% static "logo.png"%}">

这样 Django 就能显示静态文件图片了。

3. 显示效果

静态图片被正确显示了


4. 注意事项

一般情况下,static 文件夹我们会放在app目录下。这时候访问静态文件,则需要在STATICFILES_DIRS的 os.path.join 参数中再多添加一个子文件夹名,可以写成:

STATICFILES_DIRS = [
    os.path.join(BASE.DIR, 'app01','static'),
]

5. 直接访问静态文件

在 Django 配置的文件 settings.py 中有一个全局变量STATIC_URL,它定义了一个给外界用户直接访问静态文件的路径。 上面我们添加在标题中的 logo.png,我们可以在浏览器中直接通过127.0.0.1:8000/student/static/logo.png来访问。

直接访问静态文件

四、加载静态文件综合案例

为了更好地巩固 Django 加载静态文件的知识,我们做一个小案例。学生信息管理系统的登录页面。有显示图片 logo,有用户名和密码的输入框,并且有提交按钮。当点击按钮时,会弹出提示表示登录成功。

这里简单说明一下:

界面采用了 Bootstrap 框架,登录按钮的功能函数用了 jQuery 脚本。关于前端的知识我们这里就不做过多介绍了。

{% load static %}
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>login</title>
    <!--加载外部的CSS文件-->
    <link type="text/css" rel="stylesheet" href="{% static "css/bootstrap.min.css" %}">
    <link type="text/css" rel="stylesheet" href="{% static "css/basic.css" %}">
    <!--加载外部的js文件-->
    <script src="{% static "js/jquery.min.js" %}"></script>
    <script src="{% static "js/login.js" %}"></script>
</head>
<body>
    <div class="container">
        <div id = "login">
            <form class="form">
                <h2><img src="{% static "imags/mainlogo.png" %}"></h2>
                <h2>学生信息管理系统登录</h2>
                <hr>
                <hr>
                <div class="form-group">
                    <label for="user">用户名:</label>
                    <input type="text" class="form-control" placeholder="请输入用户名" id="user">
                </div>
                <div class="form-group">
                    <label for="password">密码</label>
                    <input type="password" class="form-control" placeholder="请输入密码" id="password">
                </div>
                <div class="form-group">
                    <div class="checkbox">
                        <label>
                            <input type="checkbox">请记住我
                        </label>
                    </div>
                </div>
                <button id="submit01" class="form-control">提交</button>
            </form>
        </div>
    </div>
</body>
</html>

将以上 html 文件保存在 templates 中,在 views 中配置好方法,urls 中配置好路由,最后在 settings 中配置好静态文件路径,最后启动 Django 服务器,页面显示效果如下:

效果演示:

登录页面案例演示


最后

本节,我们介绍了 Django 中 templates 的知识,Django 加载 HTML 方法、模板的语言的使用,以及加载静态文件的方法。希望大家多多练习,才能巩固所学的知识。下一节我们将继续介绍 Django 中 URL 跳转的知识!

感谢大家的阅读!

发送邮件的过程中我们经常会将表格放在邮件的正文中,那么怎么用UiPath来实现这个功能呢?表格与文字的格式不同,用文字的格式自然无法识别表格,UiPath给出的解决方案是:将邮件正文的内容html(超文本标记语言)化,html显然比一般的文本要高级,具体的实现步骤如下:

1.新建一个序列流程并取名,在“活动”栏搜索“excel”;

2.选择“Excel应用程序范围”;

3.拖入到序列中输入需要发送的excel文件路径及名称,置于英文引号下,或者通过文件夹找到相应的文件选择即可。如果该文件打开或编辑时需要密码通过,则在“属性”>“文件”选项内填入并置于英文引号内即可;

4.选择“Excel应用程序范围”中的“读取范围”并拖入到序列中;

5.确认需要读取的excel页面及范围;

6.在“属性”栏输出数据表中,右键新建变量,并取名DT;

7.在“属性”栏选项中选中“添加标头”;

8~13.在“活动”栏搜索“创建文件”,拖入到序列,确认存储的路径,在“属性”栏名称行,右键新建变量,并取名bodypath;点击“变量”,填入默认值“body.txt”;

14~17.在“活动”栏搜索“序列”,拖入到流程中,再搜索“附加行”,拖入到序列中,文本行编辑:"<html><body><table border=1>",在属性栏编辑:选择False,文件名行bodypath(输入body在下拉菜单选择);

18~20.在“活动”栏搜索“序列”,拖入到流程中,再搜索“附加行”,拖入到序列中,在属性栏编辑:选择False,文件名行bodypath(输入body在下拉菜单选择),文本输入"<tr>";

21~24.在“活动”栏搜索“遍历循环”,拖入到流程中,分别输入col/DT.Columns(“属性”杂项中TypeArgument选择:System.Data.DataColumn);然后在“活动”栏搜索“附加行”,拖入到正文中,文本栏编辑:String.Format("<th>{0}</th>",col.ColumnName);在属性栏编辑:选择False,文件名行bodypath(输入body在下拉菜单选择);

25~28.在“活动”栏搜索“附加行”,拖入到流程中在属性栏编辑:选择False,文件名行bodypath(输入body在下拉菜单选择),文本输入"</tr>";

29~34.在“活动”栏搜索“序列”,拖入到流程中,再搜索“每一行”,拖入到序列中,分别输入:CurrentRow/DT(先前数据输出变量,输入D,从下拉菜单选择DT);再搜索“附加行”,拖入到正文中,在属性栏编辑:选择False,文件名行bodypath(输入body在下拉菜单选择),文本输入"</tr>";

35~39.在“活动”栏搜索“遍历循环”,拖入到流程中,分别输入col/DT.Columns(“属性”杂项中TypeArgument选择:System.Data.DataColumn);然后在“活动”栏搜索“附加行”,拖入到正文中,文本栏编辑:String.Format("<td>{0}</td>",CurrentRow(col.ColumnName).ToString);在属性栏编辑:选择False,文件名行bodypath(输入body在下拉菜单选择);

40~43.在“活动”栏搜索“附加行”,拖入到流程中在属性栏编辑:选择False,文件名行bodypath(输入body在下拉菜单选择),文本输入"</tr>";

44~47.在“活动”栏搜索“附加行”,拖入到流程中在属性栏编辑:选择False,文件名行bodypath(输入body在下拉菜单选择),文本输入"</table></body></html>";

48~51.在“活动”栏搜索“读取”,选择“读取文本文件”,拖入到流程中在属性栏编辑:文件名行bodypath(输入body在下拉菜单选择),输出位置栏右键新建变量取名body;

52~56.在“活动”栏搜索“outlook”,选择“发送Outlook邮件消息”,拖入到流程中;目标输入接收人邮箱,放置在英文引号间;标题输入邮件标题,放置在英文引号间;正文编辑:"Hi,All,<br/>"+body+"<br/>BR<br/>姓名";再在属性栏勾选“正文是Html”即可。

备注:Html正文中"<br/>"代表换行,需要其他信息直接在正文编辑即可。

调试运行后,即可以将表格在邮件正文中展示了,试试吧。