Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

JavaSCript数组对象 #19

Open
zhnd opened this issue Mar 2, 2018 · 0 comments
Open

JavaSCript数组对象 #19

zhnd opened this issue Mar 2, 2018 · 0 comments
Labels
study note My learning record

Comments

@zhnd
Copy link
Owner

zhnd commented Mar 2, 2018

创建数组的两种基本方法:

  1. 使用Array构造函数:
    var colors = new Array();

    //添加length属性值
    var colors = new Array(20);

    //向Array构造函数传递数组中应该包含的值
    var colors = new Array("red","blue","green");

    //使用Array构造函数可以省略new操作符
    var colors = Array("red","blue","green");
  1. 使用数组字面量表示法:

数组字面量由一对包含数组项的方括号表示,多个数组项之间使用,隔开。

    var colors = ["red","blue","green"];

读取和设置数组的值:

首先使用[]并提供相应值的从0开始的索引,然后进行读取和设置:

  var colors = ["red", "blue", "green"];

  //读取数组
  console.log(colors[0]);
  console.log(colors[2]);

  // 修改数组
  colors[1] = "black";
  console.log(colors[1]);

  // 新增数组项目
  colors[3] = "brown";
  console.log(colors);

  // 读取数组长度
  console.log(colors.length);

  // 将数组长度值设置为小于实际长度,会移除后面的数组项,然后访问时返回undefined
  colors.length = 3;
  console.log(colors[3]);

  // 使用length属性在数组末尾添加新项:数组最后一项的索引值始终为length-1
  colors[colors.length] = "yellow";
  console.log(colors);

检测数组

Array.isArray()方法:

var colors = ["red", "blue", "green"];
Array.isArray(colors);

//  true

栈方法

栈是一种LIFO(Last-In-First-Out,后进先出)的数据结构,也就是最先添加的项最早被移除。

栈中项的插入————入栈;

栈中项的移除————出栈。

以上两种行为都只发生在栈的顶部。

push()方法可以接收任意数量的参数,把他们逐个添加到数组的末尾,并返回修改后数组的长度。

pop()方法从数组末尾移除最后一项,减少数组的length值,然后返回移除的项。

  var color = Array();

  // push()方法
  var count = color.push("red","blue","green");
  // 返回数组的长度
  console.log(count);

  count = color.push("black");

  console.log(color);
  console.log(color.length);

  // pop()方法
  var item = color.pop();
  // 返回移除的项
  console.log(item);
  console.log(color);
  console.log(color.length);

队列方法

队列数据结构的访问规则是FIFO(First-In-First-Out,先进先出)。

队列在列表的末端添加项,从列表的前端移除。

shift()方法能够移除数组中的第一项并返回该项,同时将数组的length-1。

结合使用shift()push()方法即可像队列一样使用数组。

可以使用unshift()(在数组前端添加任意个项并返回数组的长度)和pop()方法来从相反的方向模拟队列。也就是在数组的前端添加项,从数组的末端移除项。

重排序方法

  1. reverse()方法:反转数组项的顺序。
  var values = [1,2,3,4,5];
  values.reverse();
  console.log(values);
  1. sort()方法

在默认情况下,sort()方法按升序排列数组,sort()方法会调用每个数组项的toString()转型方法,然后比较得到字符串,确定如何排序。即使数组中的每一项都是数值,sort()方法比较的也是字符串:

    var values = [0,1,5,10,15];
    values.sort();
    console.log(values); //0,1,10,15,5

因此,sort()方法可以接收一个比较函数作为参数。

  function compare(value1, value2) {
    if (value1 < value2) {
      return -1;
    } else if (value1 > value2) {
      return 1;
    } else {
      return 0;
    }
  }

  var values = [0, 1, 3, 7, 9, 15];
  values.sort(compare);
  console.log(values); //0,1,3,7,9,15

也可通过比较函数产生降序排序,只需交换函数返回值即可:

  function compare(value1, value2) {
    if (value1 < value2) {
      return 1;
    } else if (value1 > value2) {
      return -1;
    } else {
      return 0;
    }
  }

  var values = [0, 1, 3, 7, 9, 15];
  values.sort(compare);
  console.log(values); //15,9,7,3,1,0

sort()函数的排序条件是:

  • 参数大于0,array的相邻两个元素交换位置;
  • 参数小于0,array的相邻两个元素不交换位置;
  • 参数等于0,array的相邻两个元素大小相等;所以compare自定义函数必须返回一个数值。

对于数值类型或者valueOf()方法会返回数值类型的对象类型。
可使用一个更简单的比较函数。此函数只要第二个值减第一个值即可。

    function compare (value1,value2){
    return value2 - value1;
    }

Array 对象方法

方法 描述
concat() 连接两个或更多的数组,并返回结果。
join() 把数组的所有元素放入一个字符串。元素通过指定的分隔符进行分隔。
pop() 删除并返回数组的最后一个元素
push() 向数组的末尾添加一个或多个元素,并返回新的长度。
reverse() 颠倒数组中元素的顺序。
shift() 删除并返回数组的第一个元素
slice() 从某个已有的数组返回选定的元素,arrayObject.slice(start,end),不包含end元素
sort() 对数组的元素进行排序
splice() 删除元素,并向数组添加新元素。
toSource() 返回该对象的源代码。
toString() 把数组转换为字符串,并返回结果。
toLocaleString() 把数组转换为本地数组,并返回结果。
unshift() 向数组的开头添加一个或更多元素,并返回新的长度。
valueOf() 返回数组对象的原始值

ES5 数组拓展

.forEach(element, index, array)

什么是回调函数

你到一个商店买东西,刚好你要的东西没有货,于是你在店员那里留下了你的电话,过了几天店里有货了,店员就打了你的电话,然后你接到电话后就到店里去取了货。在这个例子里,你的电话号码就叫回调函数,你把电话留给店员就叫登记回调函数,店里后来有货了叫做触发了回调关联的事件,店员给你打电话叫做调用回调函数,你到店里去取货叫做响应回调事件。

作者:常溪玲
链接:https://www.zhihu.com/question/19801131/answer/13005983
来源:知乎

遍历数组,参数为一个回调函数,回调函数有三个参数:

  • 当前元素
  • 当前元素索引值
  • 整个数组
var a = [1,2,3,4];
a.forEach(console.log);

/*
1 0 [ 1, 2, 3, 4 ]
2 1 [ 1, 2, 3, 4 ]
3 2 [ 1, 2, 3, 4 ]
4 3 [ 1, 2, 3, 4 ]

第1个是遍历的数组内容;第2个是对应的数组索引,第3个是数组本身。
 */
var a = [1, 2, 3, 4, 5, 6];

a.forEach(function(e, i, array) {
  array[i] = e + 1;
});

console.log(a);
//  [2, 3, 4, 5, 6, 7]

.map(function(element))

与forEach类似,遍历数组,回调函数返回值组成一个新数组返回,新数组索引结构和原数组一致,原数组不变。

//  数值项求平方
var data = [1, 2, 3, 4];
var arrayOfSquares = data.map(function(item) {
  return item * item;
});

console.log(arrayOfSquares);

//  [ 1, 4, 9, 16 ]

.filter(function(element))

返回数组的一个子集,回调函数用于逻辑判断是否返回,返回true则把当前元素加入到返回数组中,false则不加。

新数组只包含返回true的值,索引缺失的不包括,原数组保持不变。

// 写一个函数,操作数组,返回一个新数组,新数组中只包含正数,原数组不变

function filterPositive(arr) {
  return arr.filter(function(value) {
    return value > 0;
  });
}
var arr = [0,3, -1, 2, '饥人谷', true];
var newArr = filterPositive(arr);
console.log(newArr);

// [ 3, 2, true ]

console.log(arr);

// [ 0, 3, -1, 2, '饥人谷', true ]

在上面例子中,数组中的值0也被过滤。

filter()方法中的逻辑判断为==true/false

.every(function(element, index, array))

.some(function(element, index, array))

这两个函数类似于离散数学中的逻辑判定,回调函数返回一个布尔值

  • every是所有函数的每个回调函数都返回true的时候才会返回true,当遇到false的时候终止执行,返回false
  • some函数是“存在”有一个回调函数返回true的时候终止执行并返回true,否则返回false

在空数组上调用every返回true,some返回false

var number = [1, 2, 3, 4, 5];
var everyResults = number.every(function(item, index, array) {
  return (item > 3);
});
console.log(everyResults);
// false
//
var someResults = number.some(function(item, index, array) {
  return (item > 3);
});
console.log(someResults);
// true

.reduce(function(prev, cur, index, array)

.reduceRight(function(prev, cur, index, array)

遍历数组,调用回调函数,将数组元素组合成一个值,reduce从索引最小值开始,reduceRight反向,方法有两个参数

回调函数:把两个值合为一个,返回结果

函数的4个参数分别为:

  1. prev:前一个值;
  2. cur:当前值;
  3. index:项的索引;
  4. 数组对象。
var arr = [1, 2, 3, 4, 5];
var reduceSum = arr.reduce(function(prev, cur, index, array) {
  return prev + cur;
});
console.log(reduceSum);
// 15

.indexOf(element)

.lastIndexOf(element)

用于查找数组内指定元素位置,查找到第一个后返回其索引,没有查找到返回-1,indexOf从头至尾搜索,lastIndexOf反向搜索。

var a = [1, 2, 3, 3, 2, 1];
console.log(a.indexOf(2));
// 1
console.log(a.lastIndexOf(4));
// -1

小练习:

  1. 数组方法里push、pop、shift、unshift、join、splice分别是什么作用?用 splice函数分别实现push、pop、shift、unshift方法

在数组的栈方法中:

  • push()方法可以接受任意数量参数,并把所有参数添加到数组末尾,返回修改后数组长度;
  • pop()方法从数组末尾移除最后一项,数组长度减1,返回移除的项。

在数组的队列方法中:

  • shift()方法移除数组中的第一项,数组长度减1,并返回移除的项。
    unshift()方法在数组最前面添加任意个项,并返回新数组长度。

join()方法使用分隔符将数组转换为字符串。

splice()有3种使用方式,最终返回删除的项:

  • 删除:需指定2个参数:起始位置和删除项数;
  • 插入:需指定3个参数:起始位置、0(删除项数)、要插入的项;
  • 替换:需指定3个参数:起始位置、删除项数、要插入的项;
var colors = ['red', 'green', 'blue'];

// 使用push方法在最后面添加1项
var count = colors.push('black');
console.log(colors);
// [ 'red', 'green', 'blue', 'black' ]

//  使用splice方法在最后面添加1项
var count = colors.splice(colors.length, 0, 'white');
console.log(colors);
// [ 'red', 'green', 'blue', 'black', 'white' ]


// 使用pop方法移除最后1项
var count = colors.pop();
console.log(colors);
// [ 'red', 'green', 'blue', 'black' ]

// 使用splice方法移除最后1项
var count = colors.splice(colors.length - 1, 1);
console.log(colors);
// [ 'red', 'green', 'blue' ]


// 使用shift方法移除第1项
var count = colors.shift();
console.log(colors);
// [ 'green', 'blue' ]

// 使用splice方法移除第1项
var count = colors.splice(0, 1);
console.log(colors);
// [ 'blue' ]


// 使用unshift方法在最前面添加1项
var count = colors.unshift('blue');
console.log(colors);
// [ 'blue', 'blue' ]

// 使用splice方法在最前面添加1项
var count = colors.splice(0, 0, 'red');
console.log(colors);
// [ 'red', 'blue', 'blue' ]
  1. 写一个函数,操作数组,数组中的每一项变为原来的平方,在原数组上操作
function arrayOfSquares(arr) {
  for (var i = 0; i < arr.length; i++) {
    arr[i] = Math.pow(arr[i], 2);
  }
  return arr;
}
var data = [1, 2, 3, 4];
console.log(arrayOfSquares(data));
//  [ 1, 4, 9, 16 ]

console.log(data);
//  [ 1, 4, 9, 16 ]
  1. 写一个函数,操作数组,返回一个新数组,新数组中只包含正数,原数组不变
function filterPositive(arr) {
  return arr.filter(function(value) {
    return value > 0;
  });
}
var arr = [0,3, -1, 2, '你好', true];
var newArr = filterPositive(arr);
console.log(newArr);

// [ 3, 2, true ]

console.log(arr);

// [ 0, 3, -1, 2, '你好', true ]
@zhnd zhnd added the study note My learning record label Mar 2, 2018
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
study note My learning record
Projects
None yet
Development

No branches or pull requests

1 participant