数组与遍历

创建数组

Array.from(arrayLike,mapFn?,thisArg?)

从一个类似数组或可迭代对象创建一个新的,浅拷贝(已不是引用,但深层对象依然是引用)的数组实例。

  • arrayLike 数组、类数组对象(必须有length)、可迭代对象(Set、Map等)
  • mapFn 新数组生成前会先经过该map方法
  • thisArg mapFn中this的指向
var newArr = Array.from([1, 2, 3], (x,i) => x + i));// [1, 3, 5]
var newArr2 = Array.from({length:3});// [undefined, undefined, undefined]

遍历数组

for 循环
for ( init; condition; increment ){
    statement(s);
}

init 会首先被执行,且只会执行一次。这一步允许您声明并初始化任何循环控制变量。您也可以不在这里写任何语句,只要有一个分号出现即可。
接下来,会判断 condition。如果为 true,则执行循环主体。如果为 false,则不执行循环主体,且控制流会跳转到紧接着 for 循环的下一条语句。
在执行完 for 循环主体后,控制流会跳回上面的 increment 语句以更新循环控制变量。该语句可以留空,只要在条件后有一个分号出现即可。
条件再次被判断。如果为 true,则执行循环,这个过程会不断重复(循环主体,然后增加步值,再然后重新判断条件)。在条件变为 false 时,for 循环终止。

以下方法均不改变原数组
new Array(10);arr.length=10;这样的方式创建的数组项本质为empty,用以下方法(包括for in)遍历时不会遍历empty

  • map每一项返回一个值,返回一个新数组
arr = arr.map((item,i) => {
  return item+i
},thisValue)
  • forEach类似for循环
arr.forEach((item,i)=>{
  console.log(item)
},thisValue)

item本质上是var item = arr[i],因此直接对其重新赋值并不能修改arr[i]
thisValue可选。传递给函数的this值,默认为undefined。

  • find查找,返回第一个符合条件的值,然后结束循环
var arr = arr.find((item,i)=>{
  return item==3
},thisValue)
  • filter过滤,将符合条件的项组成新数组
var arr = arr.filter(item=>{
  return item>3
},thisValue)
  • some只要有一个值符合条件即返回true
arr.some(item=>{
  return item>3
},thisValue)
  • every所有值都符合条件才返回true
arr.every(item=>{
  return item>3
},thisValue)
  • reduce遍历后计算一个最终值
var res = arr.reduce((total, currentValue, currentIndex?, arr?)=>{
  return total+currentValue
}, initialValue?)

每次迭代的结果会作为下一次迭代的total值
initialValue为初次迭代时的total值
无initialValue时则用数组的第一项,此时数组从第二项开始迭代

  • Object.keys
    返回一个所有元素为字符串的数组,其元素来自于目标object上可枚举的属性。这些属性的顺序与手动遍历该对象属性时的一致。
// simple array
var arr = ['a', 'b', 'c'];
console.log(Object.keys(arr)); // console: ['0', '1', '2']

// array like object with random key ordering
var anObj = { 100: 'a', 2: 'b', 7: 'c' };
console.log(Object.keys(anObj)); // console: ['2', '7', '100']

// getFoo is a property which isn't enumerable
var myObj = Object.create({}, {
  getFoo: {
    value: function () { return this.foo; }
  } 
});
myObj.foo = 1;
console.log(Object.keys(myObj)); // console: ['foo']

注意:Object.keys()for in具有相同的排列顺序

  1. 如果属性名的类型是Number,那么Object.keys返回值是按照key从小到大排序
  2. 如果属性名的类型是String或Symbol,那么Object.keys返回值是按照属性被创建的时间升序排序,且一定排在Number之后
var obj = {
  a:1,
  '2':1,
  '1':1,
  d:1,
  c:1,
  '3':1
}
obj.b=66;
Object.keys(obj) //["1", "2", "3", "a", "d", "c", "b"]
  • Object.keys()背后逻辑

你可能感兴趣的:(数组与遍历)