微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

Dojo 1.6 官方教程:让数组变得简单

原题:Arrays Made Easy
原文链接: http://dojotoolkit.org/documentation/tutorials/1.6/arrays/
作者: Bran Forbes
译者: feijia (tiimfei@gmail.com)

在本教程中你将会学到如何使用dojo提供的跨平台的JavaScript数组操作

难度:初学者

适用Dojo版本:1.6

访问并操作数组是开发Web应用中的重要部分。JavaScript语言设计时就考虑到了这种需求,因此在语言层面已经加入了一些针对数组操作的方法来简化这一工作。遗憾的是不是所有浏览器都实现了同样的JavaScript标准。Dojo作为一个跨浏览器平台的框架提供了一系列数组操作方法,来弥补这一缺憾。

在数组中查找某个对象的位置

常用的数组操作之一就是在一个数组中查找某个元素,dojo为此提供了两个方法: dojo.indexOf 和dojo.lastIndexOf. dojo.indexOf 方法从前至后挨个的搜索数组中的元素,dojo.lastIndexOf则从后向前逐个搜索。 两个方法的参数是一样的,被搜索的数组,以及要查找的元素,还有一个可选的参数,即从何处开始搜索
下面我们来看一个例子:


如果某元素没有找到,两个方法都会返回-1. 要注意这两个方法搜索时都使用严格的比较操作(===),所以你除了可以查找简单数据类型(primitive),你还可以查找对象


查看示例

遍历,循环


一个常用的数组操作是循环遍历所有数组元素。使用传统的JavaScript代码通常可以写成这样

var item;
for(var i = 0; i < arr.length; i++){
item = arr[i];
// 对item进行操作
}

这样写的一个缺点是,如果你在一个事件处理函数中去访问item,你没法取到的你想要的作用域。(参考后面的例子)

使用dojo.forEach,它提供了一个标准的方法来循环遍历数组,并且在作用域链查找时保留了元素。 它基本遵守Array.prototype.forEach的行为,只有两处不同:
1. dojo.forEach会遍历那些未定义的值:即便数组中存在一些未定义的值,它仍然会对该值执行操作。

2. dojo.forEach会在数组对象上直接遍历,而浏览器的forEach会在一个数组的拷贝上执行。 所以如果你在dojo.forEach 中对数组本身做了修改,这一修改将会生效。

下面让我们看一个例子



dojo.forEach 接受3个参数:被遍历的数组,回调函数(遍历的数组时,每个元素包括未定义的元素将作为参数传递给该回调函数), 以及一个可选的作用域对象,用来规定执行该回调函数时所用的作用域。

回调函数将会被反复执行,直到数组中最后一个有值的位置。 回调函数调用时将会被传入3个参数,数组当前位置上的元素(可能是一个对象或一个原始值),当前位置的序号,以及一个数组的引用. 回调函数将会在指定的作用域中执行,如果forEach省略了第三个参数没有指定作用域,那么回调函数将会在全局的作用域中执行。

让我们在来看一下dojo.forEach的作用域参数究竟有什么好处


通过设定回调函数的作用域对象,使得回调函数能够在正确的作用域中被调用。 这种模式在对dojo widget编程时经常会用到,请牢记。

数组元素操作


Dojo 已经将数组的遍历简化了许多,接下来我们如果要想对数组中的元素做一些修改那该如何做呢?

假设我们有一个字符串数组,我们希望把其中的字符串转化成一组对象,并且每个对象的“name“属性就是字符串数组中的对应字符串。

根据我们前面已经学过的,我们可能写出如下代码



这样写当然没有错,不过现在新版的JavaScript和Dojo.map方法可以让代码进一步简化:


dojo.map的参数和forEach是一样的。 两者的区别是:dojo.map中回调函数的返回值将会被按顺序存储在一个新的数组中。而这个新数组就是dojo.map的返回值


一个Dojo提供的常用转换功能是 dojo.filter。 顾名思义,它允许你在原有数组元素中根据一定规则和条件过滤出某些元素。当然,你也可以用forEach来写,但是使用dojo.filter 会将这一过程大大简化。


查看示例

匹配


在程序中我们有时需要判断数组中的某元素是否满足某些条件:例如你想知道其中是否有某些元素定义了error属性,或者你想确定是否数组中每个元素都定义了text属性。 这时就可以使用dojo.some 或dojo.every 方法

这两个函数的签名和dojo.filter 完全一样,使用的回调函数也是一个返回布尔值的函数。 不过dojo.some 和dojo.every 两个函数本身不返回一个新数组,而是返回布尔值:dojo.every返回true表示,对数组中每个元素回调函数的都返回true,而dojo.some 返回true表示,数组中至少存在一个函数,对其调用回调函数时返回了true


小结

JavaScript规范提供了一系列强大的数组遍历和操作方法,但是不是所有的浏览器和运行时环境都能支持这些新规范中的方法。Dojo提供了跨平台的方案来弥补这一空缺,使用这些方法,可以减少代码行数,提升执行效率。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


我有一个网格,可以根据更大的树结构编辑小块数据.为了更容易知道用户保存了什么,我希望当用户第一次看到网格时,网格处于不可编辑状态.当用户准备好后,他们可以单击编辑按钮,这将使网格的某些部分可编辑.然后,有一个保存或取消按钮可以保存更改或还原.在大多数情况下它是有效的.但
我即将开始开发一款教育性的视频游戏.我已经决定以一种我可以轻松打包为Web,Mobiles和可能的Standalone版本的方式来实现这一目标.我不想使用Flash.因此,我确信(无论如何我会听取建议)使用JavaScript和SVG.我正在对这个问题进行大量研究,但我很难把各个部分放在一起.我知道Raphae
我正在使用带有Grails2.3.9的Dojo1.9.DojoNumberTextBox小部件–我在表单中使用–将固定格式(JavaScript基本格式)的实数值(例如:12.56)设置为HTML表单输入字段(但根据浏览器区域设置显示/编辑它们,所以用户总是看到格式正确的数字).另一方面,Grails期望输入字段根据浏览器
1.引言鉴于个人需求的转变,本系列将记录自学arcgisapiforjavaScript的学习历程,本篇将从最开始的arcgisapiforjavaScript部署开始,个人声明:博文不在传道受业解惑,旨在方便日后复习查阅。由于是自学,文章中可能会出现一些纰漏,请留言指出,不必留有情面哦!2.下载ArcGISforDe
我正在阅读使用dojo’sdeclare进行类创建的语法.描述令人困惑:Thedeclarefunctionisdefinedinthedojo/_base/declaremodule.declareacceptsthreearguments:className,superClass,andproperties.ClassNameTheclassNameargumentrepresentsthenameofthec
我的团队由更多的java人员和JavaScript经验丰富组成.我知道这个问题曾多次被问到,但为了弄清楚我的事实,我需要澄清一些事情,因为我在客户端技术方面的经验非常有限.我们决定使用GWT而不是纯JavaScript框架构建我们的解决方案(假设有更多的Java经验).这些是支持我的决定的事实.>
路由dojo/framework/srcouting/README.mdcommitb682b06ace25eea86d190e56dd81042565b35ed1Dojo应用程序的路由路由FeaturesRoute配置路径参数RouterHistoryManagersHashHistoryStateHistoryMemoryHistoryOutletEventRouterContextInjectionOutl
请原谅我的无知,因为我对jquery并不熟悉.是否有dojo.connect()的等价物?我找到了这个解决方案:http:/hink-robot.com/2009/06/hitch-object-oriented-event-handlers-with-jquery/但是没有断开功能!你知道jquery的其他解决方案吗?有jquery.connect但这个插件在我的测试中不起作用.
与java类一样,在dojo里也可以定义constructor 构造函数,在创建一个实例时可以对需要的属性进行初始化。//定义一个类mqsy_yjvar mqsy_yj=declare(null,{     //thedefaultusername    username: "yanjun",          //theconstructor   
我一直在寻找一些最佳实践,并想知道Dojo是否具有框架特定的最佳实践,还是最好只使用通用的Javascript标准?特别是我主要是寻找一些功能和类评论的指导方针?解决方法:对于初学者来说,这是项目的风格指南:DojoStyleGuide