【从0到1学javascript】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 ]
【从0到1学javascript】javascript数据结构----数组的更多相关文章
- 掌握javascript中的最基础数据结构-----数组
这是一篇<数据结构与算法javascript描述>的读书笔记.主要梳理了关于数组的知识.部分内容及源码来自原作. 书中第一章介绍了如何配置javascript运行环境:javascript ...
- 翻阅《数据结构与算法javascript描述》--数组篇
导读: 这篇文章比较长,介绍了数组常见的操作方法以及一些注意事项,最后还有几道经典的练习题(面试题). 数组的定义: JavaScript 中的数组是一种特殊的对象,用来表示偏移量的索引是该对象的属性 ...
- javascript实现数据结构与算法系列:栈 -- 顺序存储表示和链式表示及示例
栈(Stack)是限定仅在表尾进行插入或删除操作的线性表.表尾为栈顶(top),表头为栈底(bottom),不含元素的空表为空栈. 栈又称为后进先出(last in first out)的线性表. 堆 ...
- 从一行代码里面学点JavaScript
从一行代码里面学点JavaScript 现如今,JavaScript无处不在,因此关于JavaScript的新知识也是层出不穷.JavaScript的特点在于,要学习它的语法入门简简单,但是要精通使用 ...
- javascript实现数据结构:广义表
原文:javascript实现数据结构:广义表 广义表是线性表的推广.广泛用于人工智能的表处理语言Lisp,把广义表作为基本的数据结构. 广义表一般记作: LS = (a1, a2, ..., an ...
- JavaScript 版数据结构与算法(二)队列
今天,我们要讲的是数据结构与算法中的队列. 队列简介 队列是什么?队列是一种先进先出(FIFO)的数据结构.队列有什么用呢?队列通常用来描述算法或生活中的一些先进先出的场景,比如: 在图的广度优先遍历 ...
- javascript字典数据结构Dictionary实现
<!DOCTYPE html> <html xmlns="http://www.w3.org/1999/xhtml"> <head runat=&qu ...
- 一篇文章图文并茂地带你轻松学完 JavaScript 设计模式(一)
JavaScript 设计模式(一) 本文需要读者至少拥有基础的 ES6 知识,包括 Proxy, Reflect 以及 Generator 函数等. 至于这次为什么分了两篇文章,有损传统以及标题的正 ...
- 【跟着大佬学JavaScript】之数组去重(结果对比)
前言 数组去重在面试和工作中都是比较容易见到的问题. 这篇文章主要是来测试多个方法,对下面这个数组的去重结果进行分析讨论.如果有不对的地方,还请大家指出. const arr = [ 1, 1, &q ...
随机推荐
- Java潜在的坑持续总结
1.Java里如果有if (foo == 0),如果foo是null这里居然是会抛NPE异常而不是返回false: 2.Java里整形数值不能用==来比较,因为只有区间是[-128,127]的才能这么 ...
- MIT Molecular Biology 笔记2 DNA的突变和修复
视频 https://www.bilibili.com/video/av7973580?from=search&seid=16993146754254492690 教材 Molecular ...
- noip第2课资料
- android 增量更新原理
原理如下:服务器端设计增量表,记录数据操作顺序id,和增删改查信息.在进行数据库表操作的时候同时进行将信息保存在增量表. android客户端在请求的时候上传最后保存的id.服务端判断最后的id,返回 ...
- java poi 合并单元格
java poi 合并单元格 2017年03月29日 16:39:01 翠烟你懊恼 阅读数:26561 版权声明:本文为博主原创文章,未经博主允许不得转载. https://blog.csdn.n ...
- 最通熟易懂的Hadoop HDFS实践攻略
HDFS是用来解决什么问题?怎么解决的? 如何在命令行下操作HDFS? 如何使用Java API来操作HDFS? 在了解基本思路和操作方法后,进一步深究HDFS具体的读写数据流程 学习并实践本文教程后 ...
- 在Matlab中安装使用libsvm详细步骤(附图)
今天自己在matlab中安装libsvm,下面是详细的步骤 1.首先下载libsvmhttp://www.csie.ntu.edu.tw/~cjlin/libsvm/我的matlab版本 R2016a ...
- 右键在目录当前打开命令行cmd窗口
Win7系统大家习惯“Win+R”的组合键打开命令提示符. 方法/步骤2 通常情况下,我们点击鼠标右键是没有命令行选项的. 方法/步骤3 在桌面上先按住Shift键,然后鼠标右键,出现选项“在此处打开 ...
- Android-Throwable: A WebView method was called on thread 'JavaBridge'.
错误详情: 01-30 03:36:52.441 12000-12048/cn.h5 D/@@@: e.ttt:java.lang.RuntimeException: java.lang.Throwa ...
- 配置Info.plist (设置状态栏样式、自定义定位时系统弹出的提示语、配置3DTouch应用快捷菜单)
一.概述 iOS中很多功能需要配置Info.plist才能实现,如设置后台运行.支持打开的文件类型.自定义访问隐私内容时弹出的提示等.了解Info.plist中各字段及其含义,可以访问苹果开发网站相关 ...