在网页开发中,对数据的访问的操作是很重要的,javascript也提供了一些数组方法来处理数组类型的数据,但是并不是所有浏览器都支持这些方法。dojo提供了一些关于数组的方法,并且在浏览器兼容性、运行环境的支持方面都比较好。
dojo/_base/array是对javascript v1.6的扩展,对原生的数组函数进行了增强,使得原本在某个浏览器或某种环境下不能使用的数组方法变得可用。在dojo2.0中,这个模块看起来像是在javascript数组方法的实现底层又加了一层,增强了对浏览器的兼容性。
用法
和其它dojo/_base模块中的其他模块一样,如果以传统的方法(async:false)运行dojo加载器,这个模块会自动加载。即使自动加载了这个模块也要使用require来使用它。
require(["dojo/_base/array"], function(array){ // array contains the features });
方法
indexOf()
利用IndexOf()确定一个元素在数组中的索引。返回数组中与参数值相等的第一个元素的索引,如果没有找到相等的值返回-1.
require(["dojo/_base/array"], function(array){ array.indexOf(arrayObject, valueToFind, fromIndex, findLast); });
javascript中与它对应的方法是Array.indexOf,但是有两个不同之处:
- 对稀疏数组(sparse array:指数组中大部分的值都未被使用或都为0,仅有少部分的空间被使用,存在一定的内存空间浪费现象)操作时,dojo函数为每个索引调用回调函数,而在javascript1.6中的indexOf函数会跳过稀疏数组中未被使用的部分(hole);
- 使用==而非===判断是否相等。
参数:indexOf(arr,value,fromIndex,findLast)
- arr:Array类型参数;
- value:对象类型参数;
- fromIndex:整型可选参数;
- findLast:布尔类型参数,可选,如果为true,类似于lastIndexOf()。
require(["dojo/_base/array", "dojo/dom", "dojo/dom-construct", "dojo/on", "dojo/domReady!"], function(array, dom, domConst, on){ var arrIndxOf = ["foo", "hoo", "zoo"]; on(dom.byId("refButton1"), "click", function(){ var position = array.indexOf(arrIndxOf, "zoo"); domConst.place( "<p>The index of the word 'zoo' within the array is " + position + "</p>", "result1", "after" ); }); });
every(arr,callback,thisObject)
确定数组中的每个元素是否都满足回调函数的条件,如果都满足返回true,只要有一个不满足就返回false。对应javascript v1.6中的Array.every()方法。有一个不同之处 :对稀疏数组操作时,将数组中未被使用的值以undefined值传递给回调函数,而在javascript1.6中的indexOf函数会跳过稀疏数组中未被使用的部分(hole)。
require(["dojo/_base/array"], function(array){ array.every(arrayObject, callback, thisObject); });
如果要使用循环进行比较判断,使用every()的效率要比forEach()高。
参数:
- arr:类型为数组或字符串;
- callback:函数或字符串,带有三个参数(item, index, array)和返回值(true,如果条件满足)的回调函数;
- thisObject:对象类型,可选,可用于限定调用回调函数的作用域。
例如:
// returns false array.every([1, 2, 3, 4], function(item){ return item>1; });
<span class="content"><span style="margin-left: 0px !important;" class="block"><code class="comments">// returns true</code></span></span><div class="line alt2"><span class="content"><span style="margin-left: 0px !important;" class="block"><code class="plain">array.every([1, 2, 3, 4], </code><code class="keyword">function</code><code class="plain">(item){ </code><code class="keyword">return</code> <code class="plain">item>0; });</code></span></span></div>
filter(arr,callback,thisObject)
返回一个新的数组,数组中的元素是arr中满足回调函数callback条件的元素。对应javascript v1.6中的filter方法,有一个不同之处:对稀疏数组操作时,将数组中未被使用的值以undefined值传递给回调函数,而在javascript1.6中的indexOf函数会跳过稀疏数组中未被使用的部分(hole)。require(["dojo/_base/array"], function(array){ filteredArray = array.filter(unfilteredArray, callback, thisObject); });
forEach(arr,callback,thisObject)
对于arr中的每个元素,都执行callback函数,忽略返回值。如果要中断循环,可以使用array.every()或array.some()。forEach不会中断arr中对元素的循环。这个函数对应与Javascript v1.6的forEach()数组方法。有一个不同之处:对稀疏数组操作时,将数组中未被使用的值以undefined值传递给回调函数,而在javascript1.6中的indexOf函数会跳过稀疏数组中未被使用的部分(hole)。// log out all members of the array: array.forEach( [ "thinger", "blah", "howdy", 10 ], function(item){ console.log(item); } );
map(arr,callback,thisObject,Ctr)
对arr中的每个元素都执行callback函数(对元素进行操作),将处理结果组成一个数组返回,对应javascript v1.6的Array.map()方法。有一个不同之处:对稀疏数组操作时,将数组中未被使用的值以undefined值传递给回调函数,而在javascript1.6中的indexOf函数会跳过稀疏数组中未被使用的部分(hole)。// returns [2, 3, 4, 5] array.map([1, 2, 3, 4], function(item){ return item+1 });
some(arr,callback,thisObject)
确定arr中是否有一些元素满足callback函数的条件。对应javascript v1.6的Array.some()方法。有一个不同之处:对稀疏数组操作时,将数组中未被使用的值以undefined值传递给回调函数,而在javascript1.6中的indexOf函数会跳过稀疏数组中未被使用的部分(hole)。
// is true array.some([1, 2, 3, 4], function(item){ return item>1; });