返回顶部
首页 > 资讯 > 前端开发 > VUE >如何将JavaScript中数据结构的数组与对象进行比较
  • 158
分享到

如何将JavaScript中数据结构的数组与对象进行比较

2024-04-02 19:04:59 158人浏览 独家记忆
摘要

本篇文章给大家分享的是有关如何将javascript中数据结构的数组与对象进行比较,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。在编程中,如果

本篇文章给大家分享的是有关如何将javascript数据结构数组与对象进行比较,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。

编程中,如果你想继续深入,数据结构是我们必须要懂的一块,  学习/理解数据结构的动机可能会有所不同,一方面可能是为了面试,一方面可能单单是为了提高自己的技能或者是项目需要。无论动机是什么,如果不知道什么是数组结构及何时使用应用字们,那学数据结构是一项繁琐且无趣的过程  ?

Big O notation 大零符号一般用于描述算法的复杂程度,比如执行的时间或占用内存(磁盘)的空间等,特指最坏时的情形。

数组

数组是使用最广泛的数据结构之一。数组中的数据以有序的方式进行结构化,即数组中的第一个元素存储在索引0中,第二个元素存储在索引1中,依此类推。JavaScript为我们提供了一些内置的数据结构,数组就是其中之一  ?

在JavaScript中,定义数组最简单的方法是:

let arr = []

上面的代码行创建了一个动态数组(长度未知),为了了解如何将数组的元素存储在内存中,我们来看一个示例:

let arr = ['John', 'Lily', 'William', 'Cindy']

在上面的示例中,我们创建一个包含一些人名的数组。内存中的名称按以下方式存储:

如何将JavaScript中数据结构的数组与对象进行比较

为了理解数组是如何工作的,我们需要执行一些操作:

添加元素:

在JavaScript数组中,我们有不同方式在数组结尾,开关以及特定索引处添加元素。

在数组的末尾添加一个元素:

JavaScript 中的数组有一个默认属性 length,它表示数组的长度。除了length属性外,js还提供了 push()  方法。使用这个方法,我们可以直接在最后添加一个元素。

arr.push('Jake')

如何将JavaScript中数据结构的数组与对象进行比较

那么这个命令的复杂度是多少呢?我们知道,在默认情况下,JS提供了length属性,push()相当于使用以下命令:

arr[arr.length - 1] = 'Jake'

因为我们总是可以访问数组的长度属性,所以无论数组有多大,在末尾添加一个元素的复杂度总是O(1) ?。

在数组的开头添加一个元素:

对于此操作,JavaScript提供了一个称为unshift()的默认方法,此方法将元素添加到数组的开头。

let arr = ['John', 'Lily', 'William', 'Cindy'] arr.unshift('Robert') console.log(arr) // [ 'Robert', 'John', 'Lily', 'William', 'Cindy' ]

unshift方法复杂度好像和push方法的复杂度一样:O(1),因为我们只是在前面添加一个元素。事实并非如此,让我们看一下使用unshift方法时会发生什么:

如何将JavaScript中数据结构的数组与对象进行比较

在上图中,当我们使用unshift方法时,所有元素的索引应该增加1。这里我们的数组个数比较少,看不出存在的问题。想象一下使用一个相当长的数组,然后,使用unshift这样的方法会导致延迟,因为我们必须移动数组中每个元素的索引。因此,unshift操作的复杂度为O(n)  ?。

如果要处理较大长度的数组,请明智地使用unshift方法。在特定索引处添加元素,我们可以 splice() 方法,它的语法如下:

splice(startingIndex, deleteCount, elementToBeInserted)

因为我们要添加一个元素,所以deleteCount将为0。例如, 我们想要在数组索引为2的地方新加一个元素,可以这么用:

let arr = ['John', 'Lily', 'William', 'Cindy'] arr.splice(2, 0, 'Janice') console.log(arr) // [ 'John', 'Lily', 'Janice', 'William', 'Cindy' ]

你觉得这个操作的复杂性是多少?在上面的操作中,我们在索引2处添加了元素,因此,在索引2之后的所有后续元素都必须增加或移动1(包括之前在索引2处的元素)。

如何将JavaScript中数据结构的数组与对象进行比较

可以观察到,我们不是在移动或递增所有元素的索引,而是在索引2之后递增元素的索引。这是否意味着该操作的复杂度为 `O(n/2)?不是 ?。根据Big  O规则,常量可以从复杂性中删除,而且,我们应该考虑最坏的情况。因此,该操作的复杂度为O(n) ?。

删除元素:

就像添加元素一样,删除元素可以在不同的位置完成,在末尾、开始和特定索引处。

在数组的末尾删除一个元素:

像 push( )一样,JavaScript提供了一个默认方法pop(),用于删除/删除数组末尾的元素。

let arr = ['Janice', 'Gillian', 'Harvey', 'Tom'] arr.pop() console.log(arr) // [ 'Janice', 'Gillian', 'Harvey' ]  arr.pop() console.log(arr) // [ 'Janice', 'Gillian' ]

该操作的复杂度为O(1)。因为,无论数组有多大,删除最后一个元素都不需要改变数组中任何元素的索引。

在数组的开头删除一个元素:

JavaScript 提供了一个默认方法shift() 的默认方法,此方法删除数组的第一个元素。

let arr = ['John', 'Lily','William','Cindy'] arr.shift() console.log(arr) // ['Lily','William','Cindy'] arr.shift() console.log(arr);// ['William','Cindy']

如何将JavaScript中数据结构的数组与对象进行比较

从上面我们很容易可以看出 shift()操作的复杂度为O(n) ,因为删除第一个元素后,我们必须将所有元素的索引移位或减量1。

在特定索引处删除:

对于此操作,我们再次使用splice()方法,不过这一次,我们只使用前两个参数,因为我们不打算在该索引处添加新元素。

let arr = ['Apple', 'Orange', 'Pear', 'Banana','Watermelon'] arr.splice(2,1) console.log(arr) // ['Apple', 'Orange', 'Banana','Watermelon']

与用splice添加元素操作类似,在此操作中,我们将递减或移动索引2之后的元素索引,所以复杂度是O(n)。

查找元素:

查找只是访问数组的一个元素,我们可以通过使用方括号符号(例如: arr[4])来访问数组的元素。

你认为这个操作的复杂性是什么?我们通过一个例子来演示一下:

let fruits = ['Apple', 'Orange', 'Pear']

如何将JavaScript中数据结构的数组与对象进行比较

前面我们已经看到,数组的所有元素都按顺序存储,并且始终分组在一起。因此,如果执行fruits[1],它将告诉计算机找到名为fruits的数组并获取第二个元素(数组从索引0开始)。

由于它们是按顺序存储的,因此计算机不必查看整个内存即可找到该元素,因为所有元素按顺序分组在一起,因此它可以直接在fruits数组内部查看。因此,数组中的查找操作的复杂度为  O(1)。

我们已经完成了对数组的基本操作,我们先来小结一下什么时候可以使用数组:

当你要执行像push()(在末尾添加元素)和pop()(从末尾删除元素)这样的操作时,数组是合适的,因为这些操作的复杂度是O(1)。

除此之外,查找操作可以在数组中非常快地执行。

使用数组时,执行诸如在特定索引处或在开头添加/删除元素之类的操作可能会非常慢,因为它们的复杂度为O(n)。

对象

像数组一样,对象也是最常用的数据结构之一。对象是一种哈希表,允许我们存储键值对,而不是像在数组中看到的那样将值存储在编号索引处。

定义对象的最简单方法是:

let obj1 = {}

事例:

let student = {     name: 'Vivek',     age: 13,     class: 8 }

来看一下上面的对象是如何存储在内存中的:

如何将JavaScript中数据结构的数组与对象进行比较

可以看到,对象的键-值对是随机存储的,不像数组中所有元素都存储在一起。这也是数组与对象的主要区别,在对象中,键-值对随机存储在内存中。

我们还看到有一个哈希函数(hash  function)。那么这个哈希函数做什么呢?哈希函数从对象中获取每个键,并生成一个哈希值,然后将此哈希值转换为地址空间,在该地址空间中存储键值对。

例如,如果我们向学生对象添加以下键值对:

student.rollNumber = 322

rollNumber键通过哈希函数,然后转换为存储键和值的地址空间。现在我们已经对对象如何存储在内存有了基本的了解,让我们来执行一些操作。

添加

对于对象,我们没有单独的方法将元素添加到前面或后面,因为所有的键-值对都是随机存储的。只有一个操作是向对象添加一个新的键值对。

事例:

student.parentName = 'Narendra Singh Bisht'

如何将JavaScript中数据结构的数组与对象进行比较

从上图中我们可以得出结论,这个操作的复杂性总是O(1),因为我们不需要改变任何索引或操作对象本身,我们可以直接添加一个键-值对,它被存储在一个随机的地址空间。

删除

与添加元素一样,对象的删除操作非常简单,复杂度为O(1)。因为,我们不必在删除时更改或操作对象。

delete student.parentName

查找

查找的复杂度O(1) ,因为在这里,我们也只是借助键来访问值。访问对象中的值的一种方法:

student.class

在对象中添加,删除和查找的复杂度为O(1)???那么我们可以得出结论,我们应该每次都使用对象而不是数组吗?答案是不。尽管对象很棒,但是在使用对象时需要考虑一些小的情况,就是哈希碰撞(Hash  Collisions)。在使用对象时,并非始终应处理此情况,但了解该情况有助于我们更好地理解对象。

那么什么是哈希碰撞?

当我们定义一个对象时,我们的计算机会在内存中为该对象分配一些空间。我们需要记住,我们内存中的空间是有限的,因此有可能两个或更多键值对可能具有相同的地址空间,这种情况称为哈希碰撞。为了更好地理解它,我们看一个例子:

假设为下面的对象分配了5块空间

如何将JavaScript中数据结构的数组与对象进行比较

我们观察到两个键值对存储在相同的地址空间中。怎么会这样?当哈希函数返回一个哈希值,该哈希值转换为多个键的相同地址空间时,就会发生这种情况。因此,多个  key 被映射到相同的地址空间。由于哈希碰撞,添加和访问对象值的复杂度为O(n) ,因为要访问特定值,我们可能必须遍历各种键值对。

哈希碰撞并不是我们每次使用对象时都需要处理的东西。这只是一个特殊的情况,该情况也说明了对象不是完美的数据结构。

除了*哈希碰撞,使用对象时还必须注意另一种情况。JS 为我们提供了一个内置的keys()方法,用于遍历对象的键。

我们可以将此方法应用于任何对象,例如:object1.keys()。keys()方法遍历对象并返回所有键。尽管此方法看起来很简单,但我们需要了解对象中的键值对是随机存储在内存中的,因此,遍历对象的过程变得较慢,这与遍历按顺序将它们分组在一起的数组不同。

总结一下,当我们想执行诸如添加,删除和访问元素之类的操作时,可以使用对象,但是在使用对象时,我们需要谨慎地遍历对象,因为这可能很耗时。除了进行遍历外,我们还应该理解,有时由于哈希碰撞,访问对象操作的复杂度可能会变为O(n)。

以上就是如何将JavaScript中数据结构的数组与对象进行比较,小编相信有部分知识点可能是我们日常工作会见到或用到的。希望你能通过这篇文章学到更多知识。更多详情敬请关注编程网VUE频道。

--结束END--

本文标题: 如何将JavaScript中数据结构的数组与对象进行比较

本文链接: https://lsjlt.com/news/82362.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • 如何将JavaScript中数据结构的数组与对象进行比较
    本篇文章给大家分享的是有关如何将JavaScript中数据结构的数组与对象进行比较,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。在编程中,如果...
    99+
    2024-04-02
  • Java数据结构之对象的比较
    目录元素比较基本类型的比较对象的比较对象如何进行比较覆写基类的equal基于Comparble接口类的比较基于比较器的比较集合框架中PriorityQueue(优先级队列)的比较方式...
    99+
    2024-04-02
  • 【数据结构Java版】对象的比较之Comparable与Comparator比较器
    目录   一、基本类型的比较 二、对象类型的比较 (1)对象类型比较出现的问题 (2)重写基类equals方法 (3)基于Comparable接口的比较 1.实现Comparable接口,重写compareTo方法 (4)基于Compara...
    99+
    2023-09-06
    数据结构 比较 Comparable Comparator 算法
  • Java数据结构之对象比较详解
    目录1. PriorityQueue中插入对象2. 元素的比较2.1 基本类型的比较2.2 对象比较的问题3. 对象的比较3.1 覆写基类的equals3.2 基于Comparble...
    99+
    2024-04-02
  • JavaScript如何将对象转换为字符串进行比较
    这篇文章主要介绍了JavaScript如何将对象转换为字符串进行比较,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。将对象转换为字符串进行比较...
    99+
    2024-04-02
  • 在 PHP 中,如何根据数组值的比较对数组进行排序?
    php 中对数组进行排序的方法有:使用 sort() 函数升序排列。使用 rsort() 函数降序排列。使用 asort() 函数为关联数组升序排列值。使用 arsort() 函数为关联...
    99+
    2024-05-03
    php 数组排序 排列
  • 如何将JavaScript对象转成jQuery对象数组对象
    JavaScript 是一种高级的动态编程语言,非常流行。它使得网页在不需要刷新页面的情况下变得更加动态和交互性。然而,当 JavaScript 开发变得越来越复杂,常常需要处理大量的 HTML 元素,这时候就需要用到 jQuery。jQu...
    99+
    2023-05-14
  • 怎么在java中对数据进行比较
    这篇文章将为大家详细讲解有关怎么在java中对数据进行比较,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。Java的特点有哪些Java的特点有哪些1.Java语言作为静态面向对象编程语言的代表...
    99+
    2023-06-14
  • JavaScript中怎么对对象数组进行排序
    这期内容当中小编将会给大家带来有关JavaScript中怎么对对象数组进行排序,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。基本数组排序默认情况下,Array.sort函...
    99+
    2024-04-02
  • javascript如何将对象转化为数组
    这篇文章将为大家详细讲解有关javascript如何将对象转化为数组,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。 转化方法:1、定义一个空数...
    99+
    2024-04-02
  • Javascript如何将数组转换为对象
    这篇文章主要为大家展示了“Javascript如何将数组转换为对象”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“Javascript如何将数组转换为对象”这篇文章吧。将数组转换为对象如果要将数组...
    99+
    2023-06-17
  • 如何将JavaScript将数组转为树形结构
    1.需求 后台给了一个这样的数据让咱前端去转换为树形结构(没有重复数据)。不多说,先来看看给了一个怎样的数组数据,转换为怎样的树形结构。 服务器传过来的数组 const ar...
    99+
    2024-04-02
  • 对Go语言中的数组数据结构进行深入分析
    数组数据结构: 数组是一种基本的数据结构,它包含一系列元素,每个元素都有一个索引。数组中的元素可以是任何类型,包括其他数组。数组的大小在创建时确定,并且在以后不能改变。 代码示例:// 创建一个包含 5 个整...
    99+
    2024-02-01
    数据结构 解读 go数组 go语言
  • JavaScript如何将arguments对象转换为数组
    小编给大家分享一下JavaScript如何将arguments对象转换为数组,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!将 arguments 对象转换为数组a...
    99+
    2023-06-27
  • PHP中数组和对象的比较:哪个更好?
    PHP是一种广泛使用的编程语言,它支持多种数据类型,其中数组和对象是最常用的两种数据类型之一。虽然它们都可以用来存储和操作数据,但它们有着明显的差异。那么,PHP中数组和对象哪个更好呢?在本文中,我们将介绍它们的区别和使用场景。 数组是PH...
    99+
    2023-08-24
    linux 数组 对象
  • 如何在Python中对数组容器对象进行高效的数据处理?
    Python是一种流行的编程语言,它提供了许多内置的数据结构和容器对象,包括列表、元组、集合、字典和数组。在处理大量数据时,数组是一种非常有用的容器对象。在本文中,我们将讨论如何在Python中对数组容器对象进行高效的数据处理。 首先,让我...
    99+
    2023-08-20
    数组 容器 对象
  • 如何将 NumPy 数组转换为 PHP 和 JavaScript 中的响应式数据结构?
    NumPy 是一个流行的 Python 库,用于科学计算和数据处理。它提供了一个多维数组对象,以及许多用于数组操作的函数和方法。但是,有时候我们需要将 NumPy 数组转换为 PHP 和 JavaScript 中的响应式数据结构,这样可以更...
    99+
    2023-11-11
    javascript 响应 numpy
  • JavaScript如何通过数组解构对值进行交换
    这篇文章给大家分享的是有关JavaScript如何通过数组解构对值进行交换的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。通过数组解构对值进行交换解构赋值语法是一种 JavaScript 表达式,可以将数组中的值或...
    99+
    2023-06-27
  • HTTP 数组与 Bash 数组的性能比较如何?
    在计算机编程中,数组是一种常用的数据结构,它可以将多个元素组合在一起,以便于进行操作和处理。不同编程语言对数组的实现方式也不尽相同,本文将重点比较 HTTP 数组和 Bash 数组的性能。 HTTP 数组是一种通过 HTTP 请求获取数据...
    99+
    2023-09-23
    http 数组 bash
  • 如何进行Java中对HashMap的深度分析与比较
    如何进行Java中对HashMap的深度分析与比较,针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。在Java的世界里,无论类还是各种数据,其结构的处理是整个程序的逻辑以及性能...
    99+
    2023-06-03
软考高级职称资格查询
推荐阅读
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作