从0到1:javascript数据结构----数组

javascript中对数组的定义

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

1.1创建数组的方式

//初始化数组以下的两种声明方式相同
console.log(‘-----数组的声明方式-----‘);
var array1 = [];
var array2 = new Array();

//创建数组时指明数组长度
console.log(‘-----创建数组时可以指明数组长度-----‘);
var array3 = new Array(3);
console.log(array3.length);
array3[4] = 5;
console.log(array3);

//声明有默认值的数组,且数组中的元素不必是同一种类型(与强类型语言有区别)
console.log(‘-----默认值的数组-----‘);
var array4 = [1,‘22‘,3];
var array5 = new Array(1,‘22‘,3);
console.log(array4);
console.log(array5);

//怎么初始化一个数组,通过设置Array对象的length为0
console.log(‘------初始化一个数组----‘);
console.log(array5);
array5.length =0;
console.log(array5);

结果

判断是否是javascript数组的方法

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

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

1.2对数组的操作

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

结果

[ 1, 2, 5, 4 ]

[ 1, 2, 5, 4 ]

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

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

Array.prototype.deepCopy = function(array){
    var tempArray = [];
    //判断array参数不是null ,undefined,0,‘‘,nan,false
    if (array){
        for (var i =0,len = array.length;i<len;i++){
            tempArray[i] = array[i];
        }
        return tempArray;
    }
    return null;
}
var array1 =[1,2,3,4];
var array2 = array1;
var array3 = [];
array2[2] =5;
console.log(array1);
console.log(array2);

array3 = array3.deepCopy(array1);
console.log(array3);
array3[0] = 78;
console.log(array1);
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数组中查找元素

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

代码

var array1 = [1, 2, 3, 4, 5, 5, 4, 2, 7, 8];
Array.prototype.UnRepeat = function(array) {
    var temp = [];
    for (var i = 0, len = array.length; i < len; i++) {
        if (temp.length != 0) {
            for (var m = 0; m < temp.length; m++) {
                var isExist = false;
                if (array[i] == temp[m]) {
                    isExist = true;
                    break;
                }
            }
            if (isExist == false) {
                temp.push(array[i]);
            }
        } else {
            temp.push(array[i]);
        }
    }
    return temp;
}

结果

[ 1, 2, 3, 4, 5 ]

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

优化后的代码

Array.prototype.UnRepeat1 = function(array) {
    var temp = [],
        indexResult;
    for (var i = 0, len = array.length; i < len; i++) {
        indexResult = temp.indexOf(array[i])
        if (indexResult == -1 && indexResult != null) {
            temp.push(array[i]);
        }
    }
    return temp;
}

结果:

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

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

2.2数组的排序

看一段代码:

var nums = [1,5,9,2,3];
//将数组中的元素反转
nums.reverse();
console.log(nums);

//当数组元素是字符串时可以使用sort()
var strArray = [‘qwe‘,‘erere‘,‘sdsf‘,‘hghgj‘];
strArray.sort();
console.log(strArray);

//对数字进行sort()方法
var numArray = [1,45,67,23,09,100];
numArray.sort();
console.log(numArray);

结果如下:

[ 3, 2, 9, 5, 1 ]

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

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

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

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

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

看下面的一段代码:

//对数字进行sort()方法
var numArray = [1,45,67,23,09,100];
numArray.sort();
console.log(numArray);

function sortNum(num1,num2){
    //减号操作符会将两边的字符串强制转换为数字
    return num1 - num2;
}
numArray.sort(sortNum);
console.log(numArray);

结果为:

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

3.1数组的迭代器方法

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

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

var numArray = [1,45,67,23,09,100];
function eachFunc(num){
    console.log( num + ‘字符串‘);
}

numArray.forEach(eachFunc);
console.log(numArray);

结果:

1字符串

9字符串

23字符串

45字符串

67字符串

100字符串

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

定义:

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

代码如下:

var numArray = [1, 45, 67, 23, 09, 100];
var numArray1 = [-1, 45, 67, 23, 09, 100];
function eveFunc(num) {
    return num > 0;
}
function resultFunct(result) {
    if (result) {
        console.log(‘全部为正数.‘);
    } else {
        console.log(‘有负数存在.‘);
    }
}
var result = numArray.every(eveFunc);
resultFunct(result);

var result1 = numArray1.every(eveFunc);
resultFunct(result1);

结果:

全部为正数.

有负数存在.

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

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

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

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

结果:

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

时间: 2024-11-07 00:49:44

从0到1:javascript数据结构----数组的相关文章

重读《学习JavaScript数据结构与算法-第三版》- 第3章 数组(一)

定场诗 大将生来胆气豪,腰横秋水雁翎刀. 风吹鼍鼓山河动,电闪旌旗日月高. 天上麒麟原有种,穴中蝼蚁岂能逃. 太平待诏归来日,朕与先生解战袍. 此处应该有掌声... 前言 读<学习JavaScript数据结构与算法>- 第3章 数组,本节将为各位小伙伴分享数组的相关知识:概念.创建方式.常见方法以及ES6数组的新功能. 数组 数组是最简单的内存数据结构,用于存储一系列同一种数据类型的值. 注:虽然数组支持存储不同类型的值,但建议遵守最佳实践. 一.数组基础 创建和初始化数组 new Array

JavaScript操作数组

数组被描述为一个存储元素的线性集合,元素可以通过索引来任意存取. 几乎所有的编程语言都有类似的数据结构,但是Javascript中的数组却略有不同. Javascript中的数组是一种特殊的对象,所以在数组的操作效率上不如其他语言中的数组高. 也因为数组再JavaScript中被当做对象,所以它有很多属性和方法可以再编程时使用. 下面就简单介绍一下JavaScript中的数组的使用方法. 注:以下所有的JavaScript代码均在 jsshell 中运行,一些方法可能在其他环境中(如浏览器和su

javascript数据结构与算法---列表

前言:在日常生活中,人们经常要使用列表,比如我们有时候要去购物时,为了购物时东西要买全,我们可以在去之前,列下要买的东西,这就要用的列表了,或者我们小时候上学那段时间,每次考完试后,学校都会列出这次考试成绩前十名的同学的排名及成绩单,等等这些都是列表的列子.我们计算机内也在使用列表,那么列表适合使用在什么地方呢?不适合使用在什么地方呢? 适合使用在:当列表的元素不是很多的情况下,可以使用列表,因为对列表中的元素查找或者排序时,效率还算非常高,反之:如果列表元素非常多的情况下,就不适合使用列表了.

JavaScript数据结构——队列的实现

前面楼主简单介绍了JavaScript数据结构栈的实现,http://www.cnblogs.com/qq503665965/p/6537894.html,本次将介绍队列的实现. 队列是一种特殊的线性表,特殊之处在于它只允许在表的前端(front)进行删除操作,而在表的后端(rear)进行插入操作,和栈一样,队列是一种操作受限制的线性表.进行插入操作的端称为队尾,进行删除操作的端称为队头. 队列的两种主要操作是:向队列中插入新元素和删除队列中的元素.插入操作也叫做入队,删除操作也叫做出队.入队操

javascript中数组的22种方法 (转载)

前面的话 数组总共有22种方法,本文将其分为对象继承方法.数组转换方法.栈和队列方法.数组排序方法.数组拼接方法.创建子数组方法.数组删改方法.数组位置方法.数组归并方法和数组迭代方法共10类来进行详细介绍 对象继承方法 数组是一种特殊的对象,继承了对象Object的toString().toLocaleString()和valueOf()方法 [toString()] toString()方法返回由数组中每个值的字符串形式拼接而成的一个以逗号分隔的字符串 [注意]该方法的返回值与不使用任何参数

javascript数据结构与算法---队列

队列是一种列表,不同的是队列只能在队尾插入元素,在队首删除元素.队列用于存储按顺序排列的数据,先进先出,这点和栈不一样(后入先出).在栈中,最后入栈的元素反而被优先处理.我们现在可以把队列想象对我们去餐馆吃饭的情景,很多人排队吃饭,排在最前面的人先打饭.新来的人只能在后面排队.直到轮到他们为止. 一:对队列的操作 队列有2种主要的操作,向队尾中插入新元素enqueue()方法和删除队列中的队首的元素的dequeue()方法,另外我们还有一个读取队头的元素,这个方法我们可以叫front()方法.该

新的JavaScript数据结构Streams

最近在网上看到了一个新的 Javascript 小程序——Streams,起初以为是一个普通的 Javascript 类库,但读了关于它的介绍后,我发现,这不是一个简单的类库,而且作者的重点也不是这个类库的功能,而是——借用文中的一段话:如果你愿意花10分钟的时间来阅读这篇文章,你对编程的认识有可能会被完全的改变(除非你有函数式编程的经验!).塔河县臧清机械 还有:Streams 实际上不是一个新的想法.很多的函数式的编程语言都支持这种特征.所谓‘stream’是 Scheme 语言里的叫法,S

javascript中数组的22种方法

× 目录 [1]对象继承 [2]数组转换 [3]栈和队列[4]数组排序[5]数组拼接[6]创建数组[7]数组删改[8]数组位置[9]数组归并[10]数组迭代[11]总结 前面的话 数组总共有22种方法,本文将其分为对象继承方法.数组转换方法.栈和队列方法.数组排序方法.数组拼接方法.创建子数组方法.数组删改方法.数组位置方法.数组归并方法和数组迭代方法共10类来进行详细介绍 对象继承方法 数组是一种特殊的对象,继承了对象Object的toString().toLocaleString()和val

HTML(DOM)与JavaScript嵌套数组之间相互转换

1. [代码][JavaScript]代码     /*<html><head>  <title>HTML RESTructure</title><style></style><script>*/// workDOM函数遍历目标元素或节点// 有两种模式://   1. `element`模式(默认)(包含所定义的元素项)//   2. `node`模式(包含文本节点在内的所有节点)function walkDOM(mod