您的位置:首页 > 其它

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

2011-10-31 19:56 246 查看
原题: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则从后向前逐个搜索。 两个方法的参数是一样的,被搜索的数组,以及要查找的元素,还有一个可选的参数,即从何处开始搜索。
下面我们来看一个例子:
var obj1 = { id: 1 },
arr2 = [{ id: 0 }, obj1, { id: 2 }, { id: 3 }];

// 返回1, 因为obj1 就是数组的第2个元素
// in the array.
dojo.indexOf(arr2, obj1);

// 返回-1, 虽然查找的对象属性相似,但是它和obj1 是两个完全不同的对象,
dojo.indexOf(arr2, { id: 1 });


查看示例

遍历,循环

另一个常用的数组操作是循环遍历所有数组元素。使用传统的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 中对数组本身做了修改,这一修改将会生效。

下面让我们看一个例子

var list2 = dojo.byId("list2"),
myObject = {
prefix: "ITEM: ",
formatItem: function(item, index){
return this.prefix + item + " (" + index + ")";
},
outputItems: function(arr, node){
dojo.forEach(arr, function(item, index){
dojo.create("li", {
//如果forEach的第三个参数没有把myObject传入的话,这里的this 就不能定位到正确的scope,也就不可能找到formatItem
innerHTML: this.formatItem(item, index)
}, node);
}, this);
}
};

myObject.outputItems(arr, list2);


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

数组元素操作

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

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

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

var mapped = dojo.map(original, function(item, index){
return {
id: index * 100,
text: item
};
}); // [ { id: 0, text: "one" }, { id: 100, text: "two" }, ... ]


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

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

var arr1 = [1,2,3,4,5],
arr2 = [1,1,1,1,1];
//判断是否每个元素都为1
dojo.every(arr1, function(item){ return item == 1; }); // returns false
//判断是否至少拥有一个1
dojo.some(arr1, function(item){ return item == 1; });  // returns true

dojo.every(arr2, function(item){ return item == 1; }); // returns true
dojo.some(arr2, function(item){ return item == 1; });  // returns true

dojo.every(arr2, function(item){ return item == 2; }); // returns false
dojo.some(arr2, function(item){ return item == 2; });  // returns false


小结

JavaScript规范提供了一系列强大的数组遍历和操作方法,但是不是所有的浏览器和运行时环境都能支持这些新规范中的方法。Dojo提供了跨平台的方案来弥补这一空缺,使用这些方法,可以减少代码行数,提升执行效率。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: