Oo缘来是你oO


posts - 120,comments - 125,trackbacks - 0

           如何让你的程序运行的更快 (2)--- JavaScript中的数组字符串下标的运用
                                                  
                                                       
马嘉楠 2006-11-09


序:

好久没有写这个系列的文章了,不知道还有没有人等我的下文。哈哈,臭美一个。

在学习的过程中,好几次都准备写了,可是每次动笔的时候总会想,这个东西写出来有意义么?如果是人所共知唯独我不知道的,就算写出来对大家也没什么帮助,只能算是我的学习笔记罢了,放在这个下面显然不合适。

厚积薄发,希望每一篇文章都能对大家有所帮助(真希望每一篇都是精品,可惜水平有限啊),由于我也是初学者,文中的东西可能比较适合新手,如果有错误,请告知,谢谢。

如何让你的程序运行的更快(1) 中,讲了Java 中的 String StringBuffer,这里又跳到 JavaScript Array,呵呵,学到哪,就写到哪吧。



正文:

今天在看到 JavaScript 中 Array 这一部分的时候,发现字符串也可以作为数组的下标,以前还真不知道,孤陋寡闻。。。。
既然提供了这个特性,那么就有它的存在价值,我们来看看有什么用,欢迎大家补充。

首先,Array 是从 Object 继承下来,所以 Array 具有 Object 有的任何能力。看看Object作为集合的情况:

新建: var  object  =   new  Object(); 或  var  object  =  {};
增加: object[strIndex ] 
=
 value; (strIndex 为string)
删除:
delete
 object[strIndex ];
遍历:
for  (  var  strObjIndex  in  object ) object[strObjIndex ]; 

code 1:

var  object  =  {};    // var object = new Object(); 二者等价
object[ " First " =   " Firstmm " ;
object[
" Second " =   " Secondmm "
;
object[
" Third " =   " Thirdmm "
;
delete  object[ " Second "
]; 

for  (  var strObjIndex in
object )
    alert(
" strObjIndex = " + strObjIndex + "\nobject[" +strObjIndex + "] = "+
object[strObjIndex]); 


除了我们熟悉的方法外,Array也是可以用字符串做下标,像code 1 中的 Object 一样。

code 2:

var  array  =   new  Array();    // var array = []; 二者等价
array[ " First " =   " Firstgg " ;
array[
" Second " =   " Secondgg "
;
array[
" Third " =   " Thirdgg "

delete  array[ " First "
]; 

for  (  var  strArrayIndex  in
 array )
    alert(
" strArrayIndex =  " + strArrayIndex + "\narray[" +strArrayIndex + "] = " + array[strArrayIndex]); 


在某些情况下,用字符串做下标可以提高我们的访问效率,
例如我们要在Array中检索出一个指定的值,通常做法,我们需要遍历整个数组,如下:

code 3:

var  arrayTest  =   new  Array();    // var arrayTest = []; 二者等价
//
初始化arrayTest
arrayTest.push( " Blog " );           // arrayTest[0] = "Blog"; 二者等价
arrayTest.push( " Java " );
arrayTest.push(
" MaJianan "
);

var  output  =   "" ;    // 用于输出


// 我们需要检索出值为 Majianan 的元素,通常做法如下:
for ( var  i = 0 ; i < arrayTest.length;i ++ ){
    if (arrayTest[i] == " MaJianan "
){
        output 
=   " 用整数做下标的Array:哈哈! ^+^ \n "
;
        output 
=  output  +   " "   +  i  +   " 次才找到\n "
;
        output 
=  output  +   " arrayTest[ "   +  i  +   " ] =  "   +
 arrayTest[i];
        alert(output);
    }
else
{
        output 
=   " 用整数做下标的Array:555555555 \n "
;
        output 
=  output  +   " "   +  i  +   " 次没有找到\n "
;
        output 
=  output  +   " 找到的是arrayTest[ "   +  i  +   " ] =  "   +
 arrayTest[i]
        alert(output);
    }
}


code 4:

// 使用字符串做数组下标
var  arrayTest1  =  [];
arrayTest1[
" blog " =   " Blog "
;
arrayTest1[
" java " =   " Java "
;
arrayTest1[
" majianan " =   " MaJianan "


var  key = " majianan "


if ( typeof (arrayTest1[key]) == " undefined "
){
    output 
=   " 用字符串做下标的Array:555555555 \n "
;
    output 
=  output  +   " 没找到下标为 "   +  key  +   " 的东东。\n "
;
    output 
=  output  +   " 明明没有这个东西,还让我找,耍我呢吧!!! "
;
    alert(output);
    // do sth

} else {
    output 
=   " 用字符串做下标的Array:哈哈! ^+^ 一次搞定\n "
;
    output 
=  output  +   " 找到arrayTest1[ "   +  key  +   " ] =  "   +
 arrayTest1[key];
    alert(output);
    // do sth



var  key1 = " hello "


if ( typeof (array[key1]) == " undefined "
){
    output 
=   " 用字符串做下标的Array:555555555 \n "
;
    output 
=  output  +   " 没找到下标为 "   +  key1  +   " 的东东。\n "
;
    output 
=  output  +   " 明明没有这个东西,还让我找,耍我呢吧!!! "
;
    alert(output);
    // do sth

} else {
    output 
=   " 用字符串做下标的Array:哈哈! ^+^ 一次搞定\n "
;
    output 
=  output  +   " 找到arrayTest1[ "   +  key1  +   " ] =  "   +
 arrayTest1[key1];
    alert(output);
    // do sth



Array的这个特性(用字符串做下标)可以用来高效的检索Unique的字符串集合。
遍历用整数做下标的Array的时间复杂度是O(n),而遍历用字符串做下标的Array的时间复杂度是O(1)。



所有代码:

 



马嘉楠
jianan.ma@gmail.com

posted on 2006-11-09 16:44 马嘉楠 阅读(5192) 评论(4)  编辑  收藏 所属分类: Java Script

FeedBack:
# re: 如何让你的程序运行的更快 (2)--- JavaScript中的数组之字符串下标的运用
2007-09-12 02:09 | 李晓晓
虽然我一个没有看懂,不过你真的好强哦。= =  回复  更多评论
  
# re: 如何让你的程序运行的更快 (2)--- JavaScript中的数组之字符串下标的运用 [未登录]
2008-08-12 11:16 | James
写的不错哦,很有保存价值,
今天又学了点小知识,哈哈  回复  更多评论
  
# re: 如何让你的程序运行的更快 (2)--- JavaScript中的数组之字符串下标的运用
2011-07-15 18:14 | Tingo
"遍历用整数做下标的Array的时间复杂度是O(n),而遍历用字符串做下标的Array的时间复杂度是O(1)。"

这一段是不足以作为效率参考依据的,你没有考虑Java脚本引擎在底层处理这两种代码的不同方式。
以字符串作为下标给数组添加项目的时候,实际上是创建了一个特别的无序数组项,它本身没有公有的自动给予的数字下标,(实际上数组内部的私有数据里仍有对这个项目的唯一下标,)而值是一个特殊对象,它有一个标签属性为你指定的字符串下标,另外还有一个属性用来存放你给这个项目指定的值。在用字符串下标进行数组项获取的时候,数组内部仍然要遍历所有项目来检索该项目,和数字下标没有任何差别。另外,因为需要额外的空间来储存标签信息,用字符串下标储存的项目要比数字下标占用更多内存,在效率上反而低下。java脚本之所以提供这种功能,主要是为了方便编写,但这种“偷懒”的方式本身是算不上高效的。希望提高代码执行效率的还是应该从编译原理本身去优化代码结构。  回复  更多评论
  
# re: 如何让你的程序运行的更快 (2)--- JavaScript中的数组之字符串下标的运用 [未登录]
2013-05-13 11:10 | xxx
这个不能称之为下标吧 而是为对象添加属性,,  回复  更多评论
  

只有注册用户登录后才能发表评论。


网站导航: