这是一篇《数据结构与算法javascript描述》的读书笔记。主要梳理了关于数组的知识。部分内容及源码来自原作。

书中第一章介绍了如何配置javascript运行环境:javascript shell,不过我本人习惯使用sublime,所以直接在sublime中运行的。关于如何在sublime中配置环境请参考:

https://my.oschina.net/ximidao/blog/413101#comment-list

强烈建议把所有的代码都撸一遍以上。

1.1   Javascript中对数组的定义

数组的标准定义:一个存储元素的线性集合,元素可以通过索引来任意存取,索引通常是数字,用来计算元素之间存储位置的偏移量。

不过javascript中的数组是一种特殊的对象,用来表示偏移量的索引是该对象的属性,索引可能是整数。however,这些数字索引在内部被转换为字符串类型,是因为javascript对象中的属性名必须是字符串。

2.2 使用数组

2.2.1 创建数组

  • var nums = [1,2,3,4]; || 该方法效率更高
  • var nums = new Array(1,2,3,4);

2.2.2 读写数组

在一条赋值语句中,使用 [] 操作符将数据赋给数组,比如下面的循环,将1~100的数字赋给一个数组:

var nums = [];
for (var i =0; i<100;i++){
nums[i] = i+1;
}

还可以用 [ ] 操作符读取数组中的元素:

var nums = [1,2,3,4];
var sum = nums[0]+nums[1]+nums[2]+nums[3];
console.log(sum)

2.2.3 由字符串生成数组

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

在上述程序中,调用 splite()方法,通过单词之间的空格分隔符,讲一句话分成及部分,并将每部分作为一个元素保存于一个新建的数组中。

2.2.4 对数组整体性的操作

1.将一个数组赋值给另外一个数组
var nums = [];
for (var i = 0; i<10;i++){
nums[i] = i+1;
}
var samenums = nums;

但是如上赋值操作,只是为被赋值的数组增加一个新的引用。当通过原引用修改了数组的值,另一个引用也会发生变化。

var nums = [];
for (var i = 0; i<10;i++){
nums[i] = i+1;
}
var samenums = nums;
nums[0] = 400;
console.log(samenums[0]); //显示400

这种行为是浅复制,新数组依然指向原来的数组。

更好的方案是深复制,将原数组中的每一个元素都复制一份到新数组中。

//写个深复制函数
function copy(arr1,arr2){
for (var i = 0;i<arr1.length;i++){
arr2[i] = arr1[i];
}
}
var nums = [];
for (var i = 0; i<10;i++){
nums[i] = i+1;
}
var samenums = [];
copy(nums,samenums);
nums[0] = 400;
console.log(samenums[0]); //显示1

2.3 存取函数

2.3.1 查找元素 =====indexOf()

用来查找传进来的参数在目标数组中是否存在。如果目标数组包含该参数,就返回元素在数组中的索引;如果不包含,就返回-1。

2.3.2 数组的字符串表示 ===== join() 和 toString()

这两个方法都返回一个包含数组所有元素的字符串,各个元素之间用逗号分隔开。

2.3.3 由已有数组创建新数组 =====concat() 和 splice()

concat()方法可以合并多个数组创建一个新数组。

splice()方法截取一个数组的子集创建一个新数组。该方法第一个参数是截取的起始索引,第二个参数是截取的长度。

var itDiv = ["Mike","Clayton","Terrill","Raymond","Cynthia","Danny","Jennifer"];
var dmpDept = itDiv.splice(3,3); // Raymond,Cynthia,Danny print(cisDept);
var cisDept = itDiv;
console.log(dmpDept);// Mike,Clayton,Terrill,Jennifer

2.4 可变函数

2.4.1 为数组添加元素======push()和unshift()

push()方法将一个元素添加到数组末尾。

unshift()方法可以将元素添加到数组的开头。

var nums = [2,3,4,5];
console.log(nums); // 2,3,4,5
var newnum = 1;
nums.unshift(newnum);
console.log(nums); // 1,2,3,4,5
nums = [3,4,5];
nums.unshift(newnum,1,2);
console.log(nums); // 1,2,3,4,5

2.4.2 从数组中删除元素 pop()和 shift()

pop()方法可以删除数组末尾的元素。

var nums = [1,2,3,4,5,9];
nums.pop();
console.log(nums); // 1,2,3,4,5

shift()方法可以删除数组第一个元素。

var nums = [9,1,2,3,4,5];
nums.shift();
console.log(nums); // 1,2,3,4,5

pop() 和 shift() 方法都将删掉的元素作为方法的 返回值返回,因此可以使用一个变量来保存删除的元素:

var nums = [6,1,2,3,4,5];
var first = nums.shift(); // first gets the value 9
nums.push(first);
console.log(nums); // 1,2,3,4,5,6

2.4.3 从数组中间位置添加和删除元素=====splice()

用splice()方法为数组添加元素,需提供如下参数:

  • 起始索引(就是希望开始添加元素的地方)
  • 需要删除的元素个数(添加元素时该参数设为0)
  • 想要添加进数组的元素

    such as:
var nums=[1,2,3,7,8,9];
var newElements = [4,5,6];
nums.splice(3,0,newElements);
console.log(nums); //1,2,3,4,5,6,7,8,9

下面是用splice()删除数组元素的例子:

var nums = [1,2,3,100,200,4,5];
nums.splice(3,2);
console.log(nums); //1,2,3,4,5

2.4.4 为数组排序

1.reverse() ====> 将数组中元素的顺序进行翻转
2.sort() ======>对字符型的元素按字典顺序进行排序

对于数字类型的元素,如果要用sort()排序,可以在调用方法时传入一个大小比较函数,排序时,sort()方法会根据该函数比较数组中两个元素的大小,来决定整个数组的顺序。

function compare(num1,num2){
return num1-num2;
}
var nums = [3,4,1,80,27];
nums.sort(compare);

sort()使用了compare()函数对数组按照数字大小进行排序,而不是按照字典顺序。

2.5 迭代器方法

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

1.forEach()
接受一个函数作为参数,并对数组中的每个元素使用该函数。
    function square(num){
console.log(num,num*num);
}
var nums = [1,2,3,4,5,6];
nums.forEach(square);
2.every()

接受一个返回值为布尔型的函数,对数组中的每个元素使用该函数。如果对于所有的元素,该函数都返回true,则该方法返回true。

function isEven(num){
return num%2 == 0;
}
var nums = [2,4,6,8];
var even = nums.every(isEven);
if(even){
console.log("all numbers are even");
}else{
console.log("not all numbers are even");
}

可以改改数组里的元素试试。

3.some()

some() 方法也接受一个返回值为布尔类型的函数,只要有一个元素使得该函数返回 true, 该方法就返回 true.

function isEven(num) {
return num % 2 == 0;
}
var nums = [1,2,3,4,5,6,7,8,9,10];
var someEven = nums.some(isEven);
if (someEven) {
console.log("some numbers are even");
} else {
console.log("no numbers are even");
}
nums = [1,3,5,7,9];
someEven = nums.some(isEven);
if (someEven) {
console.log("some numbers are even");
} else {
console.log("no numbers are even");
}
4.reduce()

接受一个函数,返回一个值。该方法会从一个累加值开始,不断对累加值和 数组中的后续元素调用该函数,直到数组中的最后一个元素,最后返回得到的累加值。

下 面这个例子展示了如何使用 reduce() 方法为数组中的元素求和:

function add(runningTotal,currentValue){
return runningTotal + currentValue;
}
var nums = [1,2,3,4,5,6];
var sum = nums.reduce(add);
console.log(sum);

reduce() 方法和 add() 函数一起,从左到右,依次对数组中的元素求和。

reduce() 方法也可以用来将数组中的元素连接成一个长的字符串:

function concat(accumulatedString,tiem){
return accumulatedString + item;
}
var words = ["the ", "quick ","brown ", "fox "];
var sentence = words.reduce(concat);
console.log(sentence);

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

1. map()

map() 和 forEach() 有点儿像,对 数组中的每个元素使用某个函数。两者的区别是 map() 返回一个新的数组,该数组的元素 是对原有元素应用某个函数得到的结果。

function curve(grade){
return grade += 5;
}
var grades = [78,89,92,74];
var newgrades = grades.map(curve);
console.log(newgrades); // 83,94,97,79
2. filter()

filter() 和 every() 类似,传入一个返回值为布尔类型的函数。和 every() 方法不同的是, 当对数组中的所有元素应用该函数,结果均为 true 时,该方法并不返回 true,而是返回 一个新数组,该数组包含应用该函数后结果为 true 的元素。

function passing(num) {
return num >= 60;
}
var grades = [];
for (var i = 0; i < 20; ++i) {
grades[i] = Math.floor(Math.random() * 101);
}
var passGrades = grades.filter(passing);
console.log("All grades: ");
console.log(grades);
console.log("Passing grades: ");
console.log(passGrades);

掌握javascript中的最基础数据结构-----数组的更多相关文章

  1. day29—JavaScript中DOM的基础知识应用

    转行学开发,代码100天——2018-04-14 JavaScript中DOM操作基础知识即对DOM元素进行增删改操作.主要表现与HTML元素的操作,以及对CSS样式的操作.其主要应用知识如下图: 通 ...

  2. javascript中正则表达式的基础语法

    × 目录 [1]定义 [2]特点 [3]元字符[4]转义字符[5]字符组[6]量词[7]括号[8]选择[9]断言[10]模式[11]优先级[12]局限性 前面的话 正则表达式在人们的印象中可能是一堆无 ...

  3. javascript中对象字面量与数组字面量

    第一部分 我们知道JavaScript中的数据类型有基本数据类型和引用类型,其中Object类型就是非常常用的类型.那么如果创建一个Object类型的实例呢?下面我介绍两种方法: 第一:构造函数法. ...

  4. javascript中的字符串对象和数组对象

    1.javascript的对象的概念 在javascript中,除了null和undefined以处,其他的数据类型都被定义成了对象 也可以用创建对象的方法定义变量,string,math,array ...

  5. JavaScript中十种一步拷贝数组的方法

    JavaScript中我们经常会遇到拷贝数组的场景,但是都有哪些方式能够来实现呢,我们不妨来梳理一下. 1.扩展运算符(浅拷贝) 自从ES6出现以来,这已经成为最流行的方法.它是一个很简单的语法,但是 ...

  6. javascript中BOM部分基础知识总结

    一.什么是BOM      BOM(Browser Object Document)即浏览器对象模型.      BOM提供了独立于内容 而与浏览器窗口进行交互的对象:      由于BOM主要用于管 ...

  7. javascript中DOM部分基础知识总结

    1.DOM介绍      1.1 DOM概念      文档对象模型(Document Object Model),它定义了访问和处理HTML文档的标准方法.现在我们主要接触到的是HTML DOM. ...

  8. JavaScript 中 for in 循环和数组的问题

    本文由 伯乐在线 - ElvisKang 翻译,进林 校稿.未经许可,禁止转载!英文出处:adripofjavascript.com.欢迎加入翻译小组. JavaScript的for…in循环用于迭代 ...

  9. JavaScript中BOM的基础知识总结

    一.什么是BOM      BOM(Browser Object Model)即浏览器对象模型.      BOM提供了独立于内容 而与浏览器窗口进行交互的对象:      由于BOM主要用于管理窗口 ...

随机推荐

  1. AndroidTips-052:.aar文件依赖

    aar aar 文件是android 类库项目的输出文件,其中可以包含普通的.class,清单,以及android项目特有的资源文件. 使用方式 将.aar文件放在在自己项目的libs目录下 在gra ...

  2. Windows平台分布式架构实践 - 负载均衡

    概述 最近.NET的世界开始闹腾了,微软官方终于加入到了对.NET跨平台的支持,并且在不久的将来,我们在VS里面写的代码可能就可以通过Mono直接在Linux和Mac上运行.那么大家(开发者和企业)为 ...

  3. nodejs进阶(5)—接收请求参数

    1. get请求参数接收 我们简单举一个需要接收参数的例子 如果有个查找功能,查找关键词需要从url里接收,http://localhost:8000/search?keyword=地球.通过前面的进 ...

  4. 【SQLServer】【恢复挂起的解决方案】附加文件时候的提示“无法重新生成日志,原因是数据库关闭时存在打开的事务/用户,该数据库没有检查点或者该数据库是只读的。 ”【数据库恢复】

    汇总篇:http://www.cnblogs.com/dunitian/p/4822808.html#tsql 先贴错误: 吐槽一下: 进入正题: 新建一个同名数据库 停止MSSQL服务 替换数据库文 ...

  5. BIOS中未启用虚拟化支持系列~~例如:因此无法安装Hyper-V

    异常处理汇总-服务器系列:http://www.cnblogs.com/dunitian/p/4522983.html 一般都是启动一下CUP虚拟化就可以了 比如华硕的:

  6. C++ 应用程序性能优化

    C++ 应用程序性能优化 eryar@163.com 1. Introduction 对于几何造型内核OpenCASCADE,由于会涉及到大量的数值算法,如矩阵相关计算,微积分,Newton迭代法解方 ...

  7. MAC下 mysql不能插入中文和中文乱码的问题总结

    MAC下 mysql不能插入中文和中文乱码的问题总结 前言 本文中所提到的问题解决方案,都是基于mac环境下的,但其他环境,比如windows应该也适用. 问题描述 本文解决下边两个问题: 往mysq ...

  8. ASP.NET Core 中文文档 第五章 测试(5.2)集成测试

    原文: Integration Testing 作者: Steve Smith 翻译: 王健 校对: 孟帅洋(书缘) 集成测试确保应用程序的组件组装在一起时正常工作. ASP.NET Core支持使用 ...

  9. CSS知识总结(七)

    CSS常用样式 5.背景样式 1)背景颜色 background-color : transparent | color 常用值:①英文单词,②十六进制,③RGB或RGBA 另外,还有一种是 渐变色彩 ...

  10. C# BackgroundWorker 详解

    在C#程序中,经常会有一些耗时较长的CPU密集型运算,如果直接在 UI 线程执行这样的运算就会出现UI不响应的问题.解决这类问题的主要途径是使用多线程,启动一个后台线程,把运算操作放在这个后台线程中完 ...