数据遍历

常用的数据遍历对比

# 数组

# for循环

    var arr = ['element1', 'element2', 'element3'];
    for (var i = 0, len = arr.length; i < len; i++) {
        console.log(arr[i]);
    }
    // element1
    // element2
    // element3

​这是一个标准的for循环,通过变量 i 追踪数组的索引,从而到达访问数组内每一个元素。

缺点:

  • 1、只关心数组元素,需额外去维护变量i和边界length
  • 2、多层嵌套难以维护
  • 3、越界维护,需要花费精力去处理越界问题,一些编译型语言在遇到数组索引越界时会报错,而JavaScript 引擎将不会告诉你任何错误信息,错误定位成本会比较高。

# forEach

这个方法是数组自带的遍历方法 在某些情况下(当数组元素为引用类型时)可以改变数组本身,但是没有返回值,且不支持链式操作。

    var arr = ['element1', 'element2', 'element3'];
    arr.forEach(function(value, index, arr) {
        console.log(value);
    });// element1
    // element2
    // element3

​缺点:

  • 无法在遍历中退出,即无法break

# map

forEach的一些局限性在map中都得到了解决,map()即为映射,会新创建数组副本去承接操作后的数组。对数组每个元素都会执行,但是不要拿来做过滤筛选

# filter

map无法执行过滤,而filter本身就是过滤

# sort

默认升序排列,在数组自身上操作,会更改数组自身!

# some和every

两者返回的都是布尔值,some类似或--'||'+,而every类似且--'&'*

# for in...循环

可以解决数组越界问题,我们可以不用自己花费精力去维护i,for in 是精准迭代语句,可以遍历所有可枚举属性,可以遍历数组,对象,字符串,也可以break,continue操作。但是for in 也能遍历原型上的属性

# for of循环

见ES6

# 对象遍历

# Object.keys()

遍历的是实例对象所有可枚举的属性,返回对象的键值,形式是数组。不会遍历不可枚举的属性,也不会遍历原型上的属性。

# Object.getOwnPropertyNames()

用法同上,但是能遍历本身不可枚举的属性,原型上的不会得到遍历

# Object.values()

# Object.entries()

返回键值对数组['key',value],不遍历原型,不遍历不可枚举属性

Flutter中的手势处理和通知

手势处理是应用的必要内容, Flutter中对于手势事件的识别有两种,第一种是基础的原始指针事件(pointer),它描述的是屏幕上的指针(鼠标、触摸)的位置和移动;第二种是由单个或多个指针组成的一个动作,例如拖动、缩放、双击、长按等。

数组之差

利用lodash的 difference 和 js数组方式找出两个数组的增量与减量