js数据结构第一弹:数组

本文详细介绍了JavaScript中的数组,包括数组的定义、创建、读写操作、字符串转换、存取函数、可变函数、迭代器方法、二维及多维数组的处理,以及如何在对象中使用数组。重点探讨了数组的深拷贝、查找元素、排序方法以及对对象数组的操作,为JavaScript开发者提供了全面的数组操作指南。

1.定义

数组的标准定义是: 一个存储元素的线性集合(collection)

JavaScript 中的数组是一种特殊的对象, 用来表示偏移量的索引是该对象的属性, 索引可能是整数。 然而,这些数字索引在内部被转换为字符串类型, 这是因为JavaScript 对象中的属性名必须是字符串。 数组在 JavaScript 中只是一种特殊的对象, 所以效率上不如其他语言中的数组高。

JavaScript 中的数组, 严格来说应该称作对象, 是特殊的 JavaScript 对象, 在内部被归类为数组。 由于 Array 在 JavaScript 中被当作对象, 因此它有许多属性和方法可以在编程时使用。

2.使用

1.创建

var numbers = [];
var numbers = new Array();
var numbers = new Array(1,2,3,4,5);
//length属性
print(numbers.length); // 显示 5
var numbers = new Array(10);
print(numbers.length); // 显示 10
//调用 Array.isArray() 来判断一个对象是否是数组
var numbers = 3;
var arr = [7,4,1776];
print(Array.isArray(numbers)); // 显示 false
print(Array.isArray(arr)); // 显示 true

2.读写

    //可以使用 [] 操作符将数据赋给数组,
    var nums = [];
    for (var i = 0; i < 100; ++i) {
    nums[i] = i+1;
    }
    
    //可以使用 [] 操作符读取数组中的元素
    var numbers = [1,2,3,5,8,13,21];
    var sum = 0;
    for (var i = 0; i < numbers.length; ++i) {
    sum += numbers[i];
    } p
    rint(sum); // 显示 53

3.由字符串生成数组:split() 方法
该方法通过一些常见的分隔符, 将一个字符串分成几部分, 并将每部分作为一个元素保存于一个新建的数组中。

var sentence = "the quick brown fox jumped over the lazy dog";
var words = sentence.split(" ");
for (var i = 0; i < words.length; ++i) {
print("word " + i + ": " + words[i]);
}

4.对数组的整体性操作:浅复制与深复制
(1)浅复制: 如果数组元素是基本类型,就会拷贝一份,互不影响,而如果是对象或者数组,就会只拷贝对象和数组的引用,这样我们无论在新旧数组进行了修改,两者都会发生变化,这种叫浅拷贝

var array1 = ['a',1,true,{name:'lei',age:18}];
  
//concat() slice() 实现浅拷贝
var array2 = array1.concat()
  
//修改拷贝后的数据
array2[0] = 'b';      //array1[0]是原始数据类型 所以是直接赋值的
array2[3].name = 'zhang'; 
//array1[3]是对象数据类型 所以拷贝的是对象的引用,其实还是和原数组使用同一对象
  
console.log(array1);  // ['a',1,true,{name:'zhang',age:18}]

浅拷贝一个通用方法,实现思路:遍历对象,把属性和属性值都放在一个新的对象里

var shallowCopy = function (obj) {
  // 只拷贝对象
  if (typeof obj !== 'object') return;
  // 根据obj的类型判断是新建一个数组还是一个对象
  var newObj = obj instanceof Array ? [] : {};
  // 遍历obj,并且判断是obj的属性才拷贝
  for (var key in obj) {
    if (obj.hasOwnProperty(key)) {
      newObj[key] = obj[key];
    }
  }
  return newObj;
}

(2) 深拷贝:就是指完全的拷贝一个对象,即使嵌套了对象,两者也相互分离,修改一个对象的属性,也不会影响另一个。
深拷贝一个通用方法,实现思路:拷贝的时候判断属性值的类型,如果是对象,继续递归调用深拷贝函数

var deepCopy = function(obj) {
  // 只拷贝对象
  if (typeof obj !== 'object') return;
  // 根据obj的类型判断是新建一个数组还是一个对象
  var newObj = obj instanceof Array ? [] : {};
  for (var key in obj) {
    // 遍历obj,并且判断是obj的属性才拷贝
    if (obj.hasOwnProperty(key)) {
      // 判断属性值的类型,如果是对象递归调用深拷贝
newObj[key] = typeof obj[key] === 'object' ? deepCopy(obj[key]) : obj[key];
    }
  }
  return newObj;
}

3.存取函数

1.查找元素
indexOf() 函数是最常用的存取函数之一, 用来查找传进来的参数在目标数组中是否存在。如果目标数组包含该参数, 就返回该元素在数组中的索引; 如果不包含, 就返回 -1。

2.数组的字符串表示
有两个方法可以将数组转化为字符串: join()toString()。 这两个方法都返回一个包含数组所有元素的字符串, 各元素之间用逗号分隔开。

3.由已有数组创建新数组
concat() 和 splice() 方法允许通过已有数组创建新数组。 concat 方法可以合并多个数组创建一个新数组, splice() 方法截取一个数组的子集创建一个新数组。

4.可变函数

1.为数组添加元素
有两个方法可以为数组添加元素: push()unshift()。 push() 方法会将一个元素添加到数组末尾,unshift() 方法可以将元素添加在数组的开头。

2.从数组中删除元素
使用 pop() 方法可以删除数组末尾的元素,shift() 方法可以删除数组的第一个元素

3.从数组中间位置添加和删除元素
使用 splice() 方法为数组添加元素, 需提供如下参数:
• 起始索引(也就是你希望开始添加元素的地方) ;
• 需要删除的元素个数(添加元素时该参数设为 0) ;
• 想要添加进数组的元素。

4.为数组排序
使用 reverse()方法, 该方法将数组中元素的顺序进行翻转。
使用sort() 方法, 该方法用于元素是字符串类型,注意:
1.sort() 方法是按照字典顺序对元素进行排序的, 因此它假定元素都是字符串类型
2.让 sort() 方法也能排序数字类型的元素, 可以在调用方法时传入一个大小比较函数

function compare(num1, num2) {
return num1 - num2;
} v
ar nums = [3,1,2,100,4,200];
nums.sort(compare);
print(nums); // 1,2,3,4,100,200

5.迭代器方法

定义:这些方法对数组中的每个元素应用一个函数, 可以返回一个值、 一组值或者一个新数组。

1.不生成新数组的迭代器方法
1) forEach()方法
2) every()方法, 该方法接受一个返回值为布尔类型的函数, 对数组中的每
个元素使用该函数。
3)some() 方法也接受一个返回值为布尔类型的函数, 只要有一个元素使得该函数返回 true,该方法就返回 true
4)reduce() 方法 和reduceRight() 方法

2.生成新数组的迭代器方法
1)map() 方法
2) filter()方法

6.二维和多维数组

1.创建二维数组
方法:数组的行数、 列数和初始值

Array.matrix = function(numrows, numcols, initial) {
var arr = [];
for (var i = 0; i < numrows; ++i) {
var columns = [];
for (var j = 0; j < numcols; ++j) {
columns[j] = initial;
}
arr[i] = columns;
} r
eturn arr;
}

2.处理二维数组的元素
for循环访问:
对于按列访问, 外层循环对应行, 内层循环对应列。
对于按行访问,外层循环对应列, 内层循环对应行。

3.参差不齐数组
参差不齐的数组是指数组中每行的元素个数彼此不同。 有一行可能包含三个元素, 另一行可能包含五个元素, 有些行甚至只包含一个元素。

7.对象数组

数组还可以包含对象, 数组的方法和属性对对象依然适用

function Point(x,y) {
    this.x = x;
    this.y = y;
    } 
function displayPts(arr) {
    for (var i = 0; i < arr.length; ++i) {
    print(arr[i].x + ", " + arr[i].y);
    }
    } 
    
  var p1 = new Point(1,2);
  var p2 = new Point(3,5);
  var p3 = new Point(2,8);
  var p4 = new Point(4,4);
  var points = [p1,p2,p3,p4];
  
  for (var i = 0; i < points.length; ++i) {
  print("Point " + parseInt(i+1) + ": " + points[i].x + ", " + points[i].y);
    }

8.对象中的数组

在对象中, 可以使用数组存储复杂的数据。 该对象有两个方法, 一个方法用来增加一条新的气温记录, 另外一个方法用来计算存储在对象中的平均气温。

function weekTemps() {
    this.dataStore = [];
    this.add = add;
    this.average = average;
    } 
    
function add(temp) {
    this.dataStore.push(temp);
    } 
    
function average() {
    var total = 0;
    for (var i = 0; i < this.dataStore.length; ++i) {
    total += this.dataStore[i];
    } 
    
return total / this.dataStore.length;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值