javascript中对数组的定义

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

1.1创建数组的方式

  1. //初始化数组以下的两种声明方式相同
  2. console.log('-----数组的声明方式-----');
  3. var array1 = [];
  4. var array2 = new Array();
  5. //创建数组时指明数组长度
  6. console.log('-----创建数组时可以指明数组长度-----');
  7. var array3 = new Array(3);
  8. console.log(array3.length);
  9. array3[4] = 5;
  10. console.log(array3);
  11. //声明有默认值的数组,且数组中的元素不必是同一种类型(与强类型语言有区别)
  12. console.log('-----默认值的数组-----');
  13. var array4 = [1,'22',3];
  14. var array5 = new Array(1,'22',3);
  15. console.log(array4);
  16. console.log(array5);
  17. //怎么初始化一个数组,通过设置Array对象的length为0
  18. console.log('------初始化一个数组----');
  19. console.log(array5);
  20. array5.length =0;
  21. console.log(array5);

结果

判断是否是javascript数组的方法

  1. //判断是否是数组的方法
  2. var array5 =[];
  3. console.log(typeof array5 ==Array); //false
  4. console.log(typeof array5 ===Array); //false
  5. console.log(typeof array5); //object
  6. console.log(Array.isArray(array5)); //true
  7. console.log(array5 instanceof Array); //true

由上可以知道当我们要判断是否是js数组的时候typeof操作符是不好用的,可以使用instanceof操作符或者是使用Array对象的内置函数isArray()

1.2对数组的操作

  1. var array1 =[1,2,3,4];
  2. var array2 = array1;
  3. array2[2] =5;
  4. console.log(array1);
  5. console.log(array2);

结果

[ 1, 2, 5, 4 ]

[ 1, 2, 5, 4 ]

由结果知道简单的赋值操作只是所谓的浅复制(引用复制)。深复制和浅复制区别点击这里

一个扩展Array对象自身方法的深复制:

  1. Array.prototype.deepCopy = function(array){
  2. var tempArray = [];
  3. //判断array参数不是null ,undefined,0,'',nan,false
  4. if (array){
  5. for (var i =0,len = array.length;i<len;i++){
  6. tempArray[i] = array[i];
  7. }
  8. return tempArray;
  9. }
  10. return null;
  11. }
  12. var array1 =[1,2,3,4];
  13. var array2 = array1;
  14. var array3 = [];
  15. array2[2] =5;
  16. console.log(array1);
  17. console.log(array2);
  18. array3 = array3.deepCopy(array1);
  19. console.log(array3);
  20. array3[0] = 78;
  21. console.log(array1);
  22. console.log(array3);

结果

[ 1, 2, 5, 4 ]

[ 1, 2, 5, 4 ]

[ 1, 2, 5, 4 ]

[ 1, 2, 5, 4 ]

[ 78, 2,5, 4 ]

2.1数组中查找元素

先抛一块“石头“,最常见的数组去重问题:

代码

  1. var array1 = [1, 2, 3, 4, 5, 5, 4, 2, 7, 8];
  2. Array.prototype.UnRepeat = function(array) {
  3. var temp = [];
  4. for (var i = 0, len = array.length; i < len; i++) {
  5. if (temp.length != 0) {
  6. for (var m = 0; m < temp.length; m++) {
  7. var isExist = false;
  8. if (array[i] == temp[m]) {
  9. isExist = true;
  10. break;
  11. }
  12. }
  13. if (isExist == false) {
  14. temp.push(array[i]);
  15. }
  16. } else {
  17. temp.push(array[i]);
  18. }
  19. }
  20. return temp;
  21. }

结果

[ 1, 2, 3, 4, 5 ]

以上代码可以满足对数组进行去重的操作。但是时间复杂度较高为T(n) = O(n^2) 。其实在原生得javascript中提供了方法支持查找元素的操作。分别是indexOf()lastIndexOf()

优化后的代码

  1. Array.prototype.UnRepeat1 = function(array) {
  2. var temp = [],
  3. indexResult;
  4. for (var i = 0, len = array.length; i < len; i++) {
  5. indexResult = temp.indexOf(array[i])
  6. if (indexResult == -1 && indexResult != null) {
  7. temp.push(array[i]);
  8. }
  9. }
  10. return temp;
  11. }

结果:

[ 1, 2, 3, 4, 5, 7, 8 ]

此时的时间复杂度为T(n) = O(n)

2.2数组的排序

看一段代码:

  1. var nums = [1,5,9,2,3];
  2. //将数组中的元素反转
  3. nums.reverse();
  4. console.log(nums);
  5. //当数组元素是字符串时可以使用sort()
  6. var strArray = ['qwe','erere','sdsf','hghgj'];
  7. strArray.sort();
  8. console.log(strArray);
  9. //对数字进行sort()方法
  10. var numArray = [1,45,67,23,09,100];
  11. numArray.sort();
  12. console.log(numArray);

结果如下:

[ 3, 2, 9, 5, 1 ]

[ ‘erere’, ‘hghgj’, ‘qwe’, ‘sdsf’ ]

[ 1, 100, 23, 45, 67, 9 ]

可以很清楚的指导当数组的元素都是数字的时候,使用sort()方法对数组排序是没有效果的。这是为什么呢?

sort()方法是按照字典顺序进行排序的。因此当使用sort()方法时,如果被排序元素非数字就会直接按照字典顺序进行排序。如果是数字在内部就会先进行转化,将数字转化为字符串。

为了能够让sort()方法也能够排序数字元素,可以在sort()方法中传入一个比较大小的函数。sort()将会根据函数根据函数确定元素的大小,并且确定数组的顺序。

看下面的一段代码:

  1. //对数字进行sort()方法
  2. var numArray = [1,45,67,23,09,100];
  3. numArray.sort();
  4. console.log(numArray);
  5. function sortNum(num1,num2){
  6. //减号操作符会将两边的字符串强制转换为数字
  7. return num1 - num2;
  8. }
  9. numArray.sort(sortNum);
  10. console.log(numArray);

结果为:

[ 1, 9, 23, 45, 67, 100 ]

3.1数组的迭代器方法

3.1.1不生成新数组的迭代器方法

forEach()该方法接受一个函数参数,对数组的所有元素运用该函数

  1. var numArray = [1,45,67,23,09,100];
  2. function eachFunc(num){
  3. console.log( num + '字符串');
  4. }
  5. numArray.forEach(eachFunc);
  6. console.log(numArray);

结果:

1字符串

9字符串

23字符串

45字符串

67字符串

100字符串

[ 1, 9, 23, 45, 67, 100 ]

定义:

every()和some()方法接受一个返回值为布尔类型的函数,对数组中的元素使用该函数.如果对于所有的元素.该函数的返回值都是true,则该方法返回true.

代码如下:

  1. var numArray = [1, 45, 67, 23, 09, 100];
  2. var numArray1 = [-1, 45, 67, 23, 09, 100];
  3. function eveFunc(num) {
  4. return num > 0;
  5. }
  6. function resultFunct(result) {
  7. if (result) {
  8. console.log('全部为正数.');
  9. } else {
  10. console.log('有负数存在.');
  11. }
  12. }
  13. var result = numArray.every(eveFunc);
  14. resultFunct(result);
  15. var result1 = numArray1.every(eveFunc);
  16. resultFunct(result1);

结果:

全部为正数.

有负数存在.

3.1.2生成新数组的迭代器方法

map()和filter()对数组的每个元素应用该函数.但是map()会返回一个新数组.

filter()函数与every()函数类似,every()函数当所有元素满足条件时返回true,而filter()函数返回一个新数组.

  1. function mapFunc(num){
  2. return num *2;
  3. }
  4. var numArray1 = [-1, 45, 67, 23, 09, 100];
  5. var resultMap = numArray1.map(mapFunc);
  6. console.log(resultMap);

结果:

[ -2, 90, 134, 46, 18, 200 ]

【从0到1学javascript】javascript数据结构----数组的更多相关文章

  1. 掌握javascript中的最基础数据结构-----数组

    这是一篇<数据结构与算法javascript描述>的读书笔记.主要梳理了关于数组的知识.部分内容及源码来自原作. 书中第一章介绍了如何配置javascript运行环境:javascript ...

  2. 翻阅《数据结构与算法javascript描述》--数组篇

    导读: 这篇文章比较长,介绍了数组常见的操作方法以及一些注意事项,最后还有几道经典的练习题(面试题). 数组的定义: JavaScript 中的数组是一种特殊的对象,用来表示偏移量的索引是该对象的属性 ...

  3. javascript实现数据结构与算法系列:栈 -- 顺序存储表示和链式表示及示例

    栈(Stack)是限定仅在表尾进行插入或删除操作的线性表.表尾为栈顶(top),表头为栈底(bottom),不含元素的空表为空栈. 栈又称为后进先出(last in first out)的线性表. 堆 ...

  4. 从一行代码里面学点JavaScript

    从一行代码里面学点JavaScript 现如今,JavaScript无处不在,因此关于JavaScript的新知识也是层出不穷.JavaScript的特点在于,要学习它的语法入门简简单,但是要精通使用 ...

  5. javascript实现数据结构:广义表

    原文:javascript实现数据结构:广义表  广义表是线性表的推广.广泛用于人工智能的表处理语言Lisp,把广义表作为基本的数据结构. 广义表一般记作: LS = (a1, a2, ..., an ...

  6. JavaScript 版数据结构与算法(二)队列

    今天,我们要讲的是数据结构与算法中的队列. 队列简介 队列是什么?队列是一种先进先出(FIFO)的数据结构.队列有什么用呢?队列通常用来描述算法或生活中的一些先进先出的场景,比如: 在图的广度优先遍历 ...

  7. javascript字典数据结构Dictionary实现

    <!DOCTYPE html> <html xmlns="http://www.w3.org/1999/xhtml"> <head runat=&qu ...

  8. 一篇文章图文并茂地带你轻松学完 JavaScript 设计模式(一)

    JavaScript 设计模式(一) 本文需要读者至少拥有基础的 ES6 知识,包括 Proxy, Reflect 以及 Generator 函数等. 至于这次为什么分了两篇文章,有损传统以及标题的正 ...

  9. 【跟着大佬学JavaScript】之数组去重(结果对比)

    前言 数组去重在面试和工作中都是比较容易见到的问题. 这篇文章主要是来测试多个方法,对下面这个数组的去重结果进行分析讨论.如果有不对的地方,还请大家指出. const arr = [ 1, 1, &q ...

随机推荐

  1. 第21章:MongoDB-聚合操作--聚合管道--$geoNear

    ①$geoNear 使用“$geoNear”可以得到附近的坐标点. ②范例:准备测试数据

  2. 实现两个sym转一个sym

    CVO输出如果是一个像素并行输出,选择内嵌人插入同步码.如果两个像素并行输出是不能选择内嵌的,只能选择分离的方式.如果把输出的并行数据给VIP并且要求是内嵌,那只能在内部转或者外部转. 这里是实现外部 ...

  3. linux ps查进程 kill关闭进程

    原文链接:http://blog.sina.com.cn/s/blog_53855ace0100ded4.html 首先,我们需要使用linux下另外一个ps命令查找与进程相关的PID号:ps aux ...

  4. sys/time.h 和 time.h

    今天在燕麦工作第二天.看荣哥给我的程序,发现程序里面用的延时跟我以前使用的不同.导入两个头文件,然后用函数来获得时间.关于这个函数特别查来一下. time.h  是ISO C99 标准日期头文件. s ...

  5. noip第4课作业

    1.    计算邮资 [问题描述] 根据邮件的重量和用户是否选择加急计算邮费.计算规则:重量在1000克以内 (包含1000克),基本费8元.超过1000克的部分,每500克加收超重费4元,不足500 ...

  6. kafka参数

    转载地址http://debugo.com/kafka-params/ ############################# System ########################### ...

  7. HDU 4893 线段树的 点更新 区间求和

    Wow! Such Sequence! Time Limit: 10000/5000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Oth ...

  8. petapoco 新手上路

    PetaPoco是一个轻量级ORM框架 用法可参考http://www.toptensoftware.com/petapoco/  https://github.com/CollaboratingPl ...

  9. Flask系列10-- Flask请求上下文源码分析

    总览 一.基础准备. 1. local类 对于一个类,实例化得到它的对象后,如果开启多个线程对它的属性进行操作,会发现数据时不安全的 import time from threading import ...

  10. Linux系统软件包的管理(4)

    虽然使用源码编译安装可以具有提高速度个性化的定制等优点,但对于 Linux发行商来说,则不容易管理软件包,毕竟不是每个人都会进行源码编译的,如果能够将软件预先在相同的硬体与系统上面编译好在发布的话,不 ...