今天小编写一下Array数组操作(变异更新、替换)
来个v-for和key小补充,方便了解接下来的课程

循环指令v-for补充:

  • 使用v-for更新已渲染的元素列表时,默认用就地复用策略;列表数据修改的时候,他会根据key值去判断某个值是否修改,如果修改,则重新渲染这一项,否则复用之前的元素;
  • 我们在使用的使用经常会使用index(即数组的下标)来作为key,但其实这是不推荐的一种使用方法;
  • 最好的办法是使用数组中不会变化的那一项作为key值,对应到项目中,即每条数据都有一个唯一的id,来标识这条数据的唯一性;
  • 原因:
  • 因为Virtual DOM 使用Diff算法实现的原因

循环指令key属性补充:

Vue和React框架用遍历指令时的key值不建议用index

  • (1)key值在没有删除插入操作时只要是唯一值也无所谓,即此时为index索引也可以
  • (2)如果有删除插入的操作,后一位会继承删掉的index,这时的key写不如不写,本来key是为了让遍历性能优化的操作,这种可能重复或者改变的key值不仅不会优化还会影响性能
  • (3)index作为:key值,有可能导致第一次执行循环体初始化失败,正确的做法是尽量使用理想的 key 值-每项都有的唯一 id
    今天的内容小编分为四个部分,分别是:
    (1)数组操作补充
    (2)ASCII码值
    (3)JS限制-数组操作限制
    (4)JS限制-对象操作限制

前言

  • Vue 包含一组观察数组的变异更新与替换的方法,它们将会触发视图更新。
  • 在正式介绍前,先回顾下原生JS数组操作。
  • 变异方法 (mutation method),顾名思义,会改变原始数组。
  • 非变异 (non-mutating method) 方法,则不会改变原始数组。

JS数组操作

  • ①末尾添加-push,会改变原始数组,返回值为数组更新后的新数组长度。
    如下代码例子:
//变异方法 (mutation method)var new_array = [11, 22, 33, 44, 55, 66];//push数组末尾添加---返回值变异后的数组长度var new_array_push = new_array.push(999);console.log(new_array_push);console.log(new_array)

如下图片例子:

  • ②末尾删除-pop,会改变原始数组,返回值为被删除的数组元素。
    如下代码例子:
var new_array1 = [11, 22, 33, 44, 55, 66];//pop数组末尾删除---返回值值为被删除的数组元素var new_array_pop = new_array1.pop();console.log(new_array_pop);console.log(new_array1)

如下图片例子:

  • ③开头添加-unshift,会改变原始数组,返回更新后新数组长度
    如下代码例子:
var new_array2 = [11, 22, 33, 44, 55, 66];//unshift数组开头添加---返回值变异后的数组长度var new_array_unshift = new_array2.unshift(999);console.log(new_array_unshift);console.log(new_array2)

如下图片例子:

  • ④开头删除-shift,会改变原始数组,返回被删除的数组元素
    如下代码例子:
var new_array3 = [11, 22, 33, 44, 55, 66];//shift数组开头删除---返回值值为被删除的数组元素var new_array_shift = new_array3.shift();var new_array_shift = new_array3.shift();console.log(new_array_shift);console.log(new_array3)

如下图片例子:

  • ⑤添加、删除、替换-splice,会改变原始数组

    • 1、删除:删除(任意个数)—参数1:开始的索引;参数2:删除的长度

如下代码例子:

var new_array4 = [11, 22, 33, 44, 55, 66];//删除splice(start,length)--返回值为被删除的数组元素var new_array_splice = new_array4.splice(1, 3);//1、删除:删除(任意个数)---参数1:开始的索引;参数2:删除的长度console.log(new_array_splice);//返回被删除的数组元素console.log(new_array4)

如下图片例子:
返回被删除的数组元素

  • 2、添加(任意个数): 插入起始位置、0(要删除的项数)和要插入的项
    如下代码例子:
var new_array5 = [11, 22, 33, 44, 55, 66];//添加splice(start,0,newInfo)--返回值为空数组var new_array_splice = new_array5.splice(1, 0, 333, 4444);//2、添加(任意个数): 插入起始位置、0(要删除的项数)和要插入的项。console.log(new_array_splice);//返回空;如果要插入多个项,可以再传入第四、第五....任意多个项console.log(new_array5)

如下图片例子:
返回空;如果要插入多个项,可以再传入第四、第五…任意多个项

**替换:替换(任意个数):即删除和插入数量相等项数的综合应用,可以指向指定位置插入任意数量的项,且同时删除任意数量的项
**

  • 3、指定3个指定参数:起始位置、要删除的项数和要插入的任意数量项。
    如下代码例子:
var new_array6 = [11, 22, 33, 44, 55, 66];console.log('以下是splice替换');//替换splice(start,length,newInfo)--返回值为被替换的数组var new_array_splice = new_array6.splice(0, 3, 999, 888, 777);//3、指定3个指定参数:起始位置、要删除的项数和要插入的任意数量项。console.log(new_array_splice);//返回被替换掉的数组元素;注意:插入的项数是不必与删除的项数相等console.log(new_array6)

如下图片例子:
返回被替换掉的数组元素;注意:插入的项数是不必与删除的项数相等

  • ⑥排序-sort,会改变原始数组,返回排序后的数组
    如下代码例子:
var new_array7 = [11, 33, 55, 22, 444, 666];var new_sort = new_array7.sort()//返回值为排序后的数组console.log(new_sort)

如下图片例子:

  • 排序位置22为什么在3的前面?
  • 解析:排序时按照ASCII码进行排序,先看首个字符的ASCII码值,按照码值进行排序。

字符串和数字大小对比

小结

  • (1)纯字符串比较,转换成ASCII码再进行比较;
  • (2)纯数字和数字字符串相比较,则将字符串数字隐式转换成数字再进行比较;
  • (3)纯数字和非数字字符串比较,都返回false;

ASCII码值

拓展:

  • (1)charCodeAt() 方法可返回指定位置的字符的 Unicode 编码。这个返回值是 0 - 65535 之间的整数。
  • 语法:stringObject.charCodeAt(index)
  • 字符串中第一个字符的下标是 0。如果 index 是负数,或大于等于字符串的长度,则 charCodeAt() 返回 NaN。
  • 如下代码例子:
var str = 'hello vue'console.log(str.charCodeAt(6))//字符串中第一个字符的下标是 0。如果 index 是负数,或大于等于字符串的长度,则 charCodeAt() 返回 NaN。var str1 = '你看啥看'console.log(str1.charCodeAt(1))console.log(str1.charCodeAt(2))

如下图片例子:

  • (2)charAt() 方法可返回指定位置的字符。
  • 如下代码例子:
var str_charat = '你看啥看'//①场景:获取字符串“你看啥看”的你,需要转数组再获取var str_array = str_charat.split("").join()console.log(str_array[2])// ②现在可以直接用charAt() 方法可返回指定位置的字符console.log(str_charat.charAt(2))

如下图片例子:
①场景:获取字符串“你看啥看”的你,需要转数组再获取

②现在可以直接用charAt() 方法可返回指定位置的字符

小结:

  • 1、charCodeAt() 方法可返回指定位置的字符的 Unicode 编码。这个返回值是 0 - 65535 之间的整数。

  • 2、charAt() 方法可返回指定位置的字符。

  • 3、方法 charCodeAt() 与 charAt()
    方法执行的操作相似,只不过前者返回的是位于指定位置的字符的编码,而后者返回的是字符子串。

  • ⑦翻转-reverse,会改变原始数组,返回翻转后的数组

 var new_array7 = [11, 22, 33, 44, 55, 66];console.log('以下是reverse数组反转');var new_reverse = new_array7.reverse()//返回值为被翻转后的数组console.log(new_reverse)

以上即为数组变异更新,接下来结合Vue看下效果。

  • 案例展示:(使用数组变异更新方法会改变原始数组)

  • 之前的方法会改变原始数组,有些方法则不会改变。

  • 变异方法 (mutation method),顾名思义,会改变原始数组。

  • 相比之下,也有非变异 (non-mutating method) 方法,例如:filter(), concat() 和 slice() 。这些不会改变原始数组,但总是返回一个新数组。

  • ⑧筛选-filter,不会改变原始数组,返回筛选后的新数组
    如下代码例子:

var arr_repeat = ['A','B','A','D','C','D','E','F']var arr_filter = arr_repeat.filter(function(element,index,self){return self.indexOf(element) == index})console.log(arr_repeat)console.log(arr_filter)

如下图片例子:

  • ⑨拼接-concat,不会改变原始数组,返回拼接后的新数组
    如下代码例子:
var arr_concat1 = ['A','B','C','D']var arr_concat2 = arr_concat1.concat(['E','F','G'])console.log(arr_concat1)console.log(arr_concat2)

如下图片例子:

  • ⑩截取-slice:包含开头索引不含结尾索引,返回截取的数组元素
    如下代码例子:
var arr_slice1 = ['A','B','C','D']var arr_slice2 = arr_slice1.slice(1,2)console.log(arr_slice1)console.log(arr_slice2)

如下图片例子:

案例展示1(筛选):

点击按钮实现筛选功能

案例展示2:排序

(不想改变原数组,想通过数组副本来实现过滤和排序显示时,可以使用计算属性返回数组副本。)

案例解析:

  • Vue在检测到数组变化时,并不是直接重新渲染整个列表,而是最大化的复用DOM元素(key属性标识检测)。
  • 替换的数组里,含有相同元素的项不会被重新渲染,因此可以大胆利用新数组替换旧数组,不必担心性能问题。

由于 JavaScript 的限制,Vue 不能检测以下变动的数组:

  • ①利用索引直接设置一个项时,例如:vm.items[indexOfItem] = newValue
  • ②修改数组的长度时,例如:vm.items.length = newLength
    利用索引直接设置,无法响应
    为了解决第一类问题,有两种方式都可以实现和 vm.items[indexOfItem] = newValue 相同的效果,同时也将触发状态更新:

方法1:set方法

语法结构:Vue.set(vm.items, indexOfItem, newValue)
也可以使用 vm.$set 实例方法,该方法是全局方法 Vue.set 的一个别名。

方法2:splice替换

语法结构:vm.items.splice(indexOfItem, number, newValue)

限制2:修改数组的长度时,例如:vm.items.length = newLength

  • 对象属性改动时,vue可以实时监听检测,实现响应式。但是注意:由于 JS的限制,Vue 不能检测对象属性的添加或删除
  • 对于已经创建的实例,Vue 不能动态添加根级别的响应式属性。但是,可以使用 Vue.set(object, key, value)方法向嵌套对象添加响应式属性。
  • 使用 Vue.set(object, key, value) 方法向嵌套对象添加响应式属性
  • 此外还可以使用 vm.$set 实例方法,它只是全局 Vue.set 的别名

要点

【非变异方法】

  • filter筛选操作—返回值为被筛选后的新数组,注意:并没有改变原始数据,而是生成了新数组。

    concat拼接—返回值为被拼接后的新数组
    slice截取—返回值为被截取的数组元素(包头不包尾)
    【变异方法】
  • push数组末尾添加—返回值变异后的数组长度
  • pop数组末尾删除—返回值为被删除的数组元素
  • unshift数组开头添加—返回值变异后的数组长度
  • shift数组开头删除—返回值为被删除的数组元素
  • splice删除、添加、替换
  • 删除splice(start,length)–返回值为被删除的数组元素
  • 添加splice(start,0,newInfo)–返回值为空数组
  • 替换splice(start,length,newInfo)–返回值为被替换的数组元素,注意:删除的数组元素个数必须与新添加的数组元素个数相等。
  • sort数组排序—返回值为排序后的数组
  • reverse数组反转—返回值为被翻转后的数组

[字符串数组索引操作]

  • —indexOf从头到尾
  • —lastIndexOf从尾到头
    注意:如果字符串;里没有该子元素,则返回-1,如果有则返回该元素在字符串数组里的下标。

关于array数组操作(变异更新、替换)今天就说这么多,有问题留言小编,嘿嘿…

Vue Array数组操作(变异更新、替换)相关推荐

  1. Array数组操作(变异更新、替换)

    Array数组操作(变异更新.替换) 循环指令v-for补充 使用v-for更新渲染过的元素列表时,默认的就会使用复用策略,列表数据修改的时候,会根据key值去判断某个值是否修改:如果修改,则重新渲染 ...

  2. vue数组操作不更新视图问题

    vue 观察数组的变异方法 更新视图 push() pop() shift() unshift() splice(i,n,arr) sort(xx) reverse() ex: app.book.pu ...

  3. vue数组变化视图_vue数组操作不更新视图问题(示例代码)

    vue 观察数组的变异方法 更新视图 push() pop() shift() unshift() splice(i,n,arr) sort(xx) reverse() ex: app.book.pu ...

  4. vue数组变化视图_vue数组操作不更新视图问题

    vue 观察数组的变异方法 更新视图 push() pop() shift() unshift() splice(i,n,arr) sort(xx) reverse() ex: app.book.pu ...

  5. 微信小程序 for循环 array数组操作详解

    一.for循环的使用 ①for(let i = 0 ; i < length ; ++i){ } 示例: for(let i=0;i<length;++i){console.log(tem ...

  6. np.array 数组操作

    NumPy 数组有助于对大量数据进行高级数学和其他类型的操作.通常,这些操作的执行效率更高,比使用Python原生数组的语法更简单. 一维数组 numpy中文网 数组创建 可以使用array函数从常规 ...

  7. doctrine find的对象转换成数组_「ES6基础」Array数组的新方法(上)

    在日常工作中我们经常会与数组打交道,因此需要熟练掌握数组操作的相关方法,ES6中关于数组的操作,又给我们带来了哪些惊喜呢,Array数组操作又添加了哪些新方法? 本篇文章将从以下几个方面进行介绍: A ...

  8. vue 数组元素替换_11. VUE 数组操作

    变异方法 Vue 包含一组观察数组的变异方法,所以它们也将会触发视图更新.这些方法如下: push() 添加元素 {{ item.message }} varexample1= newVue({ el ...

  9. javascript数组降维_js Array数组实用操作大全(≈28条)不定期更新

    来源:(更新:2019-12-26)https://github.com/renzhezhilu/Blog/blob/master/javaScript/jsAdvanced/Array%E6%93% ...

最新文章

  1. 杭电 hdu 2096
  2. 应用中验证码的生成方法.
  3. 【 FPGA 】半带 FIR 滤波器(Half-band FIR Filter)
  4. 使用java搭建直播平台,我就不信你还听不明白了!
  5. oracle v$access执行很慢,Oracle bug之v$access
  6. Github+jsDelivr+PicGo 打造稳定快速、高效免费图床
  7. 如何更改mysql服务名_技术小百科 |【云小课】数据复制服务如何实现对象名映射...
  8. 干货!286页李宏毅《深度学习讲义》
  9. 中缀表达式转后缀表达式 java_中缀表达式转后缀表达式并计算结果Java实现
  10. C语言程序设计--教师信息管理系统
  11. u盘无法格式化不在计算机中,u盘被写保护无法格式化怎么办 u盘无法格式化原因及解决...
  12. java根据身份证号或生日计算年龄
  13. 微信双开,超简单,无需bat,无需代码
  14. 为一个 iOS 应用编写一个简单的 Node.js/MongoDB Web 服务
  15. 每周分享第 10 期
  16. 盛世昊通董车长2.0,数字化整合行业产业链变革
  17. 领军服务外包 大连软件业加速对接资本市场
  18. 360度解读山内溥:百年任天堂的传奇“基因”(转)
  19. Day02:Linux进阶(二)
  20. CSS透明度[简述]

热门文章

  1. c语言里的负数用16进制表示什么,什么是十六进制表达式0x80000000在C语言的枚举声明中的含义...
  2. 自制python小工具(2)——Gadgets 0.2
  3. MATLAB算法实战应用案例精讲-【人工智能】SLAM(概念篇)(补充篇)
  4. 类似淘宝详情页SKU页面
  5. C++ particle code translation
  6. [Python] 信息论:计算机自信息,信息熵,对比中文和英文信息熵。
  7. 华为防火墙基本配置实例
  8. Eclipse启动慢分析及解决 / Eclipse启动参数整理
  9. 我在富士康挨踢了七年(五. 激情与暴力)
  10. Unity3D for VR 学习(6): 再次温故知新-3D数学