资讯专栏INFORMATION COLUMN

javascript数据结构与算法之数组

BDEEFE / 985人阅读

摘要:数组还有的一个特别之处是数组可以包含任何类型的数据,混合型的,很强大。由已有数组创建新数组和方法允许通过已有数组创建数组。

数组的定义

数组是一个线性分配的内存, 存储的元素可以通过索引(通常为数字)来任意存取,而这个索引(也就是我们所谓的下标,从0开始)用来计算元素之间存储的位置的偏移量(其实就是为了区分不同的数据)。

js的数组和其它编程语言有些不同,表面上看和大多编程语言的数组差不多,但在内部却有着不一样的实现。js提供了一些类数组(array-like)特性的对象。它会把数组的下标转变成字符串,变成一个对象的属性。比如

var numbers = ["zero", "one", "two"];

这个简单的数组会被转换为

var numbers_object = {"0": "zero", "1": "one", "2": "two"};

从代码本身的功能来说没有太大区别,刚好有相同的名字和值。但是numbers继承了Array.prototype,而numbers_object继承了Object.prototype。所以numbers就有了大量有用好玩的方法,还有一个特别的length属性。

js数组还有的一个特别之处是数组可以包含任何类型的数据,混合型的,很强大。

特别的length属性

每个数组都有一个length属性,length是没有上界的。如果用大于等于数组长度的数字作为下标来存储元素,那么length的值就会增大来容纳新元素,不会发生数组越界。

var array = [10];
var array[11] = "iCoding";
array.length //12

那么问题来了,js数组有没有下界。一般情况下数组都是从0开始的,如果执行array[-1] = "net"会发生什么情况呢?数组的长度length会怎样变化?抱着刨根问题的精神回答,js数组会给array增加属性为-1的 "-1": "net" 元素 ,其实本质就是上面所说的转换成对象,此时我们查询length的值并未发生变化,估计js源代码的length属性的值是从0开始计数的。

创建数组

最简单的方式

var numbers = [ ]; //length = 0

直接放入一组元素

var numbers = [1,2,3]; //length = 3

通过构造函数创建数组

var numbers = new Array(); //length = 0

同样可以直接放入一组元素

var numbers = new Array(1,2,3); //length = 3

那么那种方式最好?大多数javascript专家推荐使用[ ] 操作符,和使用构造函数相比,这种方式被认为效率最高。

数组操作
array[array.length] = "iCoding";   --> ["zero", "one", "two", "iCoding"]

array.push("net");  --> ["zero", "one", "two", "iCoding", "net"]

由于JavaScript的数组其实就是对象,所以delete运算符可以用来从数组中移除元素

delete array[1]; --> ["zero", , "two", "iCoding", "net"]

但是这种方式会在数组中留下一空洞。因为排在后面的元素还会保留着它们最初的属性。

JavaScript中有一个splice方法

var array = ["zero", "one", "two", "iCoding", "net"]

array.splice(1, 1); -->["zero", "two", "iCoding", "net"]

其中splice第一个参数表示移除的位置,第二个参数表示移除元素的个数。

但是不好的一点是:被删除属性后面的每一个属性必须被移除,并且以一个新的键值重新插入,如果操作大型数组,效率可能就会不高。

如果想修改数组,依然可以用splice方法

var array = ["a", "b", "c", "d", "e"];

array.splice(3, 1, "icoding", "net"); -->["a", "b", "c", "icoding", "net", "e"];

对数组的整体性操作

浅复制

当我们将一个数组赋给另外一个数组,只是为被赋值的数组增加了一个新的引用。当你通过原引用修改了数组的值,另一个引用也会感知到这个变化,相应的值就会发生改变。这种行为被称为浅复制。

var nums = [0, 1, 2, 3];
var same_nums = nums;
nums[1] = 99;
console.log(same_nums[1]); //99

深复制

顾名思义,也就是我们不同通过引用来改变另一个自己。写个函数就ok了。

function copy(arr1, arr2) {
for(var i = 0, i < arr1.length, i++) { 
arr2[i] = arr1[i]; 
  }
}

将每个数组中的值遍历出来在重新赋值到新数组中,在我们程序中调用一下就好了。

var nums = [0, 1, 2, 3];
var same_nums = []
copy(nums, same_nums);
nums[1] = 99;
console.log(same_nums[1]); //1

数组转化成字符串

这里有join()和toString()两个方法。

var names = ["joes", "beyond"];

var namestr1 = names.join(); 

console.log(namestr);  //"joes,beyond"

var namestr2 = names.toString(); 

console.log(namestr);  //"joes,beyond"

由已有数组创建新数组

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

我们先来看看contact()方法的工作原理。随意创建2个数组。

var nums1 = [1, 2, 3, 4, 5];
var nums2 = [6, 7, 8, 9];
var mix_nums = nums1.contact(nums2);
console.log(mix_nums);  // [1, 2, 3, 4, 5, 6, 7, 8, 9]
参考

Michael McMillan.《Data Structures & Algorithms with JavaScript》
Douglas Crockford.《JavaScript: The Good Parts》

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/86285.html

相关文章

  • Deep in JS - 收藏集 - 掘金

    摘要:今天同学去面试,做了两道面试题全部做错了,发过来给道典型的面试题前端掘金在界中,开发人员的需求量一直居高不下。 排序算法 -- JavaScript 标准参考教程(alpha) - 前端 - 掘金来自《JavaScript 标准参考教程(alpha)》,by 阮一峰 目录 冒泡排序 简介 算法实现 选择排序 简介 算法实现 ... 图例详解那道 setTimeout 与循环闭包的经典面...

    enali 评论0 收藏0
  • 常用排序算法JavaScript实现

    摘要:代码实现六堆排序算法简介堆排序是指利用堆这种数据结构所设计的一种排序算法。九计数排序算法简介计数排序是一种稳定的排序算法。计数排序不是比较排序,排序的速度快于任何比较排序算法。 赞助我以写出更好的文章,give me a cup of coffee? 2017最新最全前端面试题 1、插入排序 1)算法简介 插入排序(Insertion-Sort)的算法描述是一种简单直观的排序算法。它...

    jerry 评论0 收藏0
  • 学习数据结构算法队列

    摘要:于是翻出了机房里的这本学习数据结构与算法开始学习程序员的基础知识。这本书用了我最熟悉的来实现各种数据结构和算法,而且书很薄,可以说是一本不错的入门教程。队列在头部删除元素,尾部添加元素。 本系列所有文章:第一篇文章:学习数据结构与算法之栈与队列第二篇文章:学习数据结构与算法之链表第三篇文章:学习数据结构与算法之集合第四篇文章:学习数据结构与算法之字典和散列表第五篇文章:学习数据结构与算...

    pingan8787 评论0 收藏0
  • LeetCode JavaScript 解答第23题 —— 合并K个有序链表(Merge K S

    摘要:分治算法递归每层操作分解将原问题分解成一系列的子问题。分治算法满足的条件可分解原问题与分解成的小问题具有相同的模式无关联原问题分解成的子问题可以独立求解,子问题之间没有相关性,这一点是分治算法跟动态规划的明显区别。 Time:2019/4/10Title: Merge K Sorted ListsDifficulty: DifficultyAuthor: 小鹿 题目:Merge K...

    zhou_you 评论0 收藏0
  • JS 栈

    摘要:栈学习数据结构与算法读书笔记。栈又名堆栈,是一种遵循后进先出原则的有序集合。新添加或待删除的元素都保存在栈的末尾,称作栈顶,另一端称作栈底。在栈里,新元素都靠近栈顶,旧元素都接近栈底。 栈 《学习JavaScript数据结构与算法》读书笔记。 栈(stack)又名堆栈,是一种遵循后进先出(LIFO)原则的有序集合。新添加或待删除的元素都保存在栈的末尾,称作栈顶,另一端称作栈底。在栈里,...

    Lin_R 评论0 收藏0

发表评论

0条评论

BDEEFE

|高级讲师

TA的文章

阅读更多
最新活动
阅读需要支付1元查看
<