sort方法接收一个函数作为参数,这里嵌套一层函数用来接收对象属性名,其他部分代码与正常使用sort方法相同. var arr = [ {name:'zopp',age:0}, {name...//数组根据数组对象中的某个属性值进行排序的方法 //使用例子:newArray.sort(sortBy('number',false)) //表示根据number属性降序排列;若第二个参数不传递...,默认表示升序排序 //@param attr 排序的属性 如number属性 //@param rev true表示升序排列,false降序排序 sortBy: function
参考答案: Array.prototype.distinct = function() { var ret = []; for (var i =...
Comparable(一个方法(comparaTo)) Iterator(循环遍历, 3个方法) 返回值boolean hasNext()集合里有没有下一个 返回值Object next(...最基本的两种检索集合中的所有对象的方法: 1: for循环和get()方法: 2: 使用 迭代器(Iterator): List主要分: List:最大的特点是有序,它保证维护元素特定的顺序...一个List可以生成ListIterator,使用它可以从两个方向遍历List,也可以从List中间插入和移除元素。 ArrayList:由数组实现。...Map(映射): Map 是一种把键对象和值对象映射的集合,它的每一个元素都包含一对键对象和值对象。...Set接口 Set是最简单的一种集合。集合中的对象不按特定的方式排序,并且没有重复对象。
一个数据只要部署了 Symbol.iterator,就具有了 iterator接口,就可以使用 for...of 循环遍历它的成员。...聪明的你肯定能想到,我们能不能提供一个方法来遍历所有的数据结构呢,这个方法能遍历所有的数据结构,一定是这些数据结构要有一些通用的一些特征,然后这个公共的方法会根据这些通用的特征去进行遍历。...一个对象如果要具备可被for...of循环调用的 Iterator 接口,就必须在Symbol.iterator的属性上部署遍历器生成方法(原型链上的对象具有该方法也可)。...数组的另一个细节是可以直接访问任何位置的任何元素,而想要访问链表中间的一个元素,需要从起点(表头)开始迭代列表直到找到所有元素。 现实生活中也有一些链表的例子,比如说寻宝游戏。...而for...of可以。 for...in遍历数组遍历的是键名,所有适合遍历对象,`for...of``遍历数组遍历的是键值。
迭代器协议是指:对象需要提供next方法,它要么返回迭代中的下一项,要么就引起一个StopIteration异常,以终止迭代 可迭代对象就是:实现了迭代器协议的对象 协议是一种约定,可迭代对象实现迭代器协议...举个例子:在所有语言中,我们都可以使用for循环来遍历数组,Python的list底层实现是一个数组,所以,我们可以使用for循环来遍历list。...为什么在Python中,文件还可以使用for循环进行遍历呢?这是因为,在Python中,文件对象实现了迭代器协议,for循环并不知道它遍历的是一个文件对象,它只管使用迭代器协议访问对象即可。...yield语句一次返回一个结果,在每个结果中间,挂起函数的状态,以便下次重它离开的地方继续执行 生成器表达式:类似于列表推导,但是,生成器返回按需产生结果的一个对象,而不是一次构建一个结果列表 2.1...yield语句挂起该生成器函数的状态,保留足够的信息,以便之后从它离开的地方继续执行 3. 示例 我们再来看两个生成器的例子,以便大家更好的理解生成器的作用。
Python 中任意的对象,只要它定义了可以返回一个迭代器的 __iter__ 方法,或者定义了可以支持下标索引的 __getitem__ 方法,那么它就是一个可迭代对象。...有没有快速判定的方法呢?答案是肯定的。可以直接使用 for 循环进行遍历的对象就是可迭代对象。...yield 是生成器实现 __next__() 方法的关键。它作为生成器执行的暂停恢复点,可以对 yield 表达式进行赋值,也可以将 yield 表达式的值返回。...个人认为,生成器算是 Python 非常棒的特性。它的出现能帮助大大节省些内存空间。假如我们要生成从 1 到 10 这 10 个数字,采用列表的方式定义,会占用 10 个地址空间。...采用生成器,只会占用一个地址空间。因为生成器并没有把所有的值存在内存中,而是在运行时生成值。所以生成器只能访问一次。 创建一个从包含 1 到 10 的生成器的例子。
可以用 for in,也可以用 for 循环,当做一个数组来处理,毕竟字符串是类数组对象。...但是有没有发现一个问题,或者我们站在一个更高的维度去看待,其实这些方法都不能通用,也就是说上面的这几种集合数据不能使用统一的遍历方法来进行数据获取。...那有没有一种更好的,通用方法,让开发者用的更舒服,更爽呢? 答案是肯定的,es5的时候还没出现,升级到 es6就有了。...然后根据 i 的值从数组内取出数据作为 value,然后通过索引判断得到 done的值。 当 i=3的时候,超过数组的最大索引,无可用数据返回,此时done 为true,遍历完成。...如果 for of 循环提前退出,则会自动调用 return 方法,需要注意的是 return 方法必须有返回值,且返回值必须是 一个object。
先简单说下集合和数组的区别: 数组是大小固定的,并且同一个数组只能存放类型一样的数据(基本类型/引用类型),而JAVA集合可以存储和操作数目不固定的一组数据。...)方法返回的元素 2.2、Set(集合) Set是最简单的一种集合。...:一种是基本的ArrayList,其优点在于随机访问元素;另一种是更强大的LinkedList,它并不是为快速随机访问设计的,而是具有一套更通用的方法。...一个List可以生成ListIterator,使用它可以从两个方向遍历List,也可以从List中间插入和移除元 素。 ArrayList:由数组实现的List。...2.4、Map(映射) Map 是一种把键对象和值对象映射的集合,它的每一个元素都包含一对键对象和值对象。 Map没有继承于Collection接口。
5)如果我们想在这个用来存储学生信息的数组中存储一些老师的信息,数组是无法满足这个需求的,它只能存储相同类型的元素。 为了解决这些数组在使用过程中的痛点,集合框架应用而生。...例如,存储元素的顺序是 11、22、33,那么我们从 List 中取出这些元素的时候也会按照 11、22、33 这个顺序。...OK,我们已经知道,Map中存放的是两种对象,一种称为 key(键),一种称为 value(值),它俩在 Map 中是一一对应关系,这一对对象又称做 Map 中的一个 「Entry」(项)。...同样的,Map 也提供了获取每一个 Entry 对象中对应键和对应值的方法,这样我们在遍历 Map 集合时,就可以从每一个键值对(Entry)对象中获取对应的键与对应的值了: public K getKey...❓ 这里提个问题,「为什么迭代器不封装成一个类,而是做成一个接口」?假设迭代器是一个类,这样我们就可以创建该类的对象,调用该类的方法来实现 Collection 的遍历。
1、Iterator的定义 以下是Wikipedia(维基百科)中对迭代器的摘要定义: 在计算机编程中,迭代器是使程序员能够遍历容器(尤其是列表)的对象。...在抽象级别上,我们可以想象,只要一个对象提供上述五个功能,就可以通过for循环遍历它。 实际上,迭代器不过是一个类,它实现了上面提到的所有五个步骤。...它仅在需要时才生成值,因此可以帮助我们节省大量内存。 3.3、易于添加其他功能 使用迭代器的另一个好处是我们可以装饰它以添加其他功能。...我们可以使用一种简单的方法来区分这些差异: $books = new DirectoryIterator('books'); foreach($books as $key=>$value) {...PHP引入了一些生成器,它们提供了一种简单的方法来实现简单的迭代器,而又不会增加实现迭代器接口的类的开销或复杂性。 究竟是什么生成器?
三:数组是一种可读/可写数据结构---没有办法创建一个只读数组。然而可以使用集合提供的ReadOnly方法,以只读方式来使用集合。该方法将返回一个集合的只读版本。...1.2 Set(集合) Set是最简单的一种集合。集合中的对象不按特定的方式排序,并且没有重复对象。...于是在使用迭代器遍历Set时,结果会按元素插入的次序显示。 1.3 List(列表) List的特征是其元素以线性方式存储,集合中可以存放重复对象。 ...一个List可以生成ListIterator,使用它可以从两个方向遍历List,也可以从List中间插入和移除元 素。 ArrayList:由数组实现的List。...1.4 Map(映射) Map 是一种把键对象和值对象映射的集合,它的每一个元素都包含一对键对象和值对象。
首先,我们都知道for循环是一个基础迭代操作,大多数的容器对象都可以使用for循环,那么,我们从for循环开始: 你有没有想过,for循环的内部实现原理呢?...最简单的解释:实现了迭代方法可以被迭代的对象,可以使用isinstance()方法进行判断。...迭代器和可迭代对象的区别是:迭代器可以使用next()方法不断调用并返回下一个值,除了调用可迭代对象的__iter__方法来将可迭代对象转换为迭代器以外,还可以使用iter()方法。...当需要一个将返回一个序列或在循环中执行的函数时,就可以使用生成器,因为当这些元素被传递到另一个函数中进行后续处理时,一次返回一个元素可以有效的提升整体性能,最重要的是,比迭代器简洁!...这种时候你可以用生成器表达式啊,生成式表达式是一种实现生成器的便捷方式,将列表推导式的中括号替换为圆括号,生成器表达式是一种边循环边计算,使得列表的元素可以在循环过程中一个个的推算出来,不需要创建完整的列表
递归 递归 是一种解决计算问题的方法,其中解决方案取决于同一问题的较小实例的解决方案。递归通过使用从其自身代码内部调用自身的函数来解决这些递归问题。 排序算法 排序 是指以特定格式排列数据。...迭代器 迭代器 是一个包含可计数数量值的对象。迭代器是一个可以进行迭代的对象,这意味着您可以遍历所有的值。...类 类 是用户定义的蓝图或原型,用于创建对象。类提供了一种将数据和功能捆绑在一起的方法。创建新类会创建新类型的对象,允许创建该类型的新实例。每个类实例都可以附加属性以维护其状态。...这些软件包的范围从简单的 Hello World 实现到先进的深度学习库。 Pip Python 的标准软件包管理器是 pip。它允许您安装和管理不属于 Python 标准库的软件包。...生成器推导 生成器推导是在 Python 中使用单行代码创建生成器的简洁方法。它们类似于列表推导,但是与其创建列表不同,它们创建一个生成器对象,根据需要按需生成值。
常用的就是 HahsMap 和 TreeMap了。不过这些实现大多数都是非线程安全的。 ---- 二、List 列表 Java 的 List 是非常常用的数据类型。List中的元素是有序,可重复的。...当从 ArrayList 的中间位置插入或者删除元素时,需要对数组进行复制、移动、代价比较高。因此,它适合随机查找和遍历,不适合插入和删除。...1、HashMap(数组 + 链表 + 红黑树实现) HashMap 根据键的 hashCode 值存储数据,大多数情况下可以直接定位到它的值,因而具有很快的访问速度,但遍历顺序却是不确定的。...Ps:一般来讲,遍历集合数据有三种方法:for 循环、foreach 循环、iterator 迭代器。实际上,foreach 循环只是一个语法糖而已,底层是基于迭代器来实现的。...ListIterator 可以实现对象的修改,set() 方法可以实现。Iierator 仅能遍历,不能修改。
但是当它们与for...of循环配合使用,你会得到一种简而美的遍历对象的属性的方式。 让我们一探究竟吧。...代码看起来很简单,但是可以通过去掉let mealName = meals[key]来优化它。 通过使用Object.values()可以直接访问对象属性值,可以实现优化。...然后通过for...of循环解构性参数let [key, value]把数组中的值分配给key和value变量。 正如所见,访问的键和值现在已经是一种舒适而且易于理解的形式。...你可以获得Map的大小(对于一个简单的对象,你必须手动操作),并使它作为键或对象类型(简单对象把键当作一个字符串原始类型)。...在for...of循环语句中可以直接使用迭代器。 关于顺序上的笔记 JavaScript对象是简单的键值映射。所以对象的属性的顺序是无关紧要的。在大多数情况下,你不应该依赖它。
简单来说,散列表就是字典的另一种实现,它的优势是比字典能更快地找到一个值。在常规的字典操作中,使用get()方法获得一个值,需要遍历整个数据结构,这样明显会比较慢。...这样查找数据时,就可以通过散列值直接定位位置,就好比数组下标一样直接定位元素,免去了整个数据结构的遍历,因此比字典的字符串定位要快上许多。...设置索引是在散列表中存储了索引值和对应记录的引用,以便快速的找到数据。 当然了散列表还有其他应用,比如我们 JavaScript 当中的对象,那就是一个妥妥的散列表。...其实作用非常简单,就是为了避免 hash 值过大,然后才将它除以一个数值然后取整。这里用的 20,你也可以根据你的是实际情况决定数值范围,改用其他数值。...这也是散列表与字典的不同之处,只需要确保 hash 唯一即可。 ValuePair 是上篇介绍的类,用来存储键值对。 get 方法 从散列表中获取一个值也很简单。
迭代器 迭代是访问集合元素的一种方式。迭代器是一个可以记住遍历的位置的对象。迭代器对象从集合的第一 个元素开始访问,直到所有的元素被访问完结束。迭代器只能往前不会后退。...如何判断一个对象是否可以迭代 可以使用 isinstance() 判断一个对象是否是 Iterable 对象: # 字符串、列表、元组、字典、集合都可以被for循环,说明他们都是可迭代的 from collections.abc...for循环就是基于迭代器协议提供了一个统一的可以遍历所有对象的方法,即在遍历之前,先调用对象的 __iter__方法将其转换成一个迭代器,然后使用迭代器协议去实现循环访问,这样所有的对象就都可以通 过...yield语句一次返 回一个结果,在每个结果中间,挂起函数的状态,以便下次从它离开的地方继续执行 生成器表达式:类似于列表推导,但是,生成器返回按需产生结果的一个对象,而不是一次构建一 个结果列表 生成器...的作用 可以使用next()函数让生成器从断点处继续执行,即唤醒生成器(函数) send send 获取下一个值的效果和next基本一致,但是是一个特殊的next,在执行next的功能后还会给上一个yield
在有了之前源码的铺垫之后,我们后面的阅读之路将会变得简单很多,因为很多Collection的结构与Map的类似,甚至有不少是直接用了Map里的方法。接下来让我们一起来看一下ArrayList的源码。...顾名思义,ArrayList的结构实际就是一个Object[]。所以它的特性很明显,插入一个元素的时候,是耗时是一个常量时间O(1),在插入n个元素的时候,需要的时间就是O(n)。...此接口的主要目的是允许一般的算法更改其行为,从而在将其应用到随机或连续访问列表时能提供良好的性能。...笔者循环了 1000 * 1000 次,贴出比较结果,仅供参考,有兴趣的朋友们可以试一试,循环次数越多越明显: ----------now is arraylist---------- 使用Iterator...3.4.2 add(E e) 在看源码之前,我们先思考一个问题,往数组里添加元素的时候要注意什么: 对于刚初始化的数组,要初始化它的大小 判断数组大小是否足够,如果不够大,扩容 对于扩容要判断是否到达数组的最大数量
在学习任何开发语言时候,for循环是必不可少的一种语法,可能所有开发人员都会使用它。它非常经典,以至于每个开发语言都至少包括一种关于循环的语法版本。...让我们尽量简要的解释它们: For…in 循环遍历对象的可枚举属性,也就是说当你的自定义对象被用作哈希表或字典时,使用For…in 遍历他们时将变得非常简单。...从结果可以看到,并没有遍历出每一个字母,而是遍历到了每个属性,正如您看到的,遍历出的数字并非是没有用的,因为"Hello World!"[1] 同样是可以返回相应的字母的。...通过上述的示例我们可知,他们相互一个遍历属性,一个遍历值,那么有没有什么方法可以既获得属性又获得值呢,答案是有的,使用entries方法,就可以同时获得属性和值,如下所示: let myArr = ["...不管怎样,先撇开哲学上的争论不谈,.foreach方法是for循环的另一个版本,但是这个方法是数组对象的一部分,它的目的是接收一个函数和一个额外的可选参数,以便在执行函数时重新定义该函数的上下文。
领取专属 10元无门槛券
手把手带您无忧上云