众所周之,js是没有ArrayList类的,但是js自带了Array类(虽然在js中已经是动态数组了),不过Array类使用起来还是挺别扭的,尤其是一些方法名称,更是让人摸不着头脑,于是就有了自己封装一个ArrayList类的想法。
( function (win) { var ArrayList = function () { this .datas = []; }; var proto = ArrayList.prototype; proto.size = function () { return this .datas.length; }; proto.isEmpty = function () { return this .size() === 0 ; }; proto.contains = function (value) { return this .datas.indexOf(value) !== -1 ; }; proto.indexOf = function (value) { for ( var index in this .datas) { if ( this .datas[index] === value) { return index; } } return -1 ; }; proto.lastIndexOf = function (value) { for ( var index = this .size(); index >= 0; index-- ) { if ( this .datas[index] === value) { return index; } } }; proto.toArray = function () { return this .datas; }; proto.outOfBound = function (index) { return index < 0 || index > ( this .size() - 1 ); }; proto.get = function (index) { if ( this .outOfBound(index)) { return null ; } return this .datas[index]; }; proto.set = function (index, value) { this .datas[index] = value; }; proto.add = function (value) { this .datas.push(value); }; proto.insert = function (index, value) { if ( this .outOfBound(index)) { return ; } this .datas.splice(index, 0 , value); }; proto.remove = function (index) { if ( this .outOfBound(index)) { return false ; } this .datas.splice(index, 1 ); return true ; }; proto.removeValue = function (value) { if ( this .contains(value)) { this .remove( this .indexOf(value)); return true ; } return false ; }; proto.clear = function () { this .datas.splice(0, this .size()); }; proto.addAll = function (list) { if (!list instanceof ArrayList) { return false ; } for ( var index in list.datas) { this .add(list.get(index)); } return true ; }; proto.insertAll = function (index, list) { if ( this .outOfBound(index)) { return false ; } if (!list instanceof ArrayList) { return false ; } var pos = index; for ( var index in list.datas) { this .insert(pos++ , list.get(index)); } return true ; }; function numberorder(a, b) { return a - b; } proto.sort = function (isNumber){ if (isNumber){ this .datas.sort(numberorder); return ; } this .datas.sort(); }; proto.toString = function (){ return "[" + this .datas.join() + "]" ; }; proto.valueOf = function (){ return this .toString(); }; win.ArrayList = ArrayList; })(window);
我们写一个页面测试一下。
<! DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd" > < html > < head > < meta http-equiv ="Content-Type" content ="text/html; charset=UTF-8" > < title > Insert title here </ title > < script type ="text/javascript" src ="ArrayList.js" ></ script > < script type ="text/javascript" > window.print = function (value) { document.write(value); }; window.println = function (value) { print(value); document.write( " <br/> " ); }; window.onload = function () { var list = new ArrayList(); list.add( " jack " ); list.add( 43 ); list.add( true ); println(list.get( 0 )); println(list.get( 1 )); println(list.get( 2 )); println(list.get( 3 )); println( " ---------------------- " ); println(list.size()); list.remove( 2 ); println(list); println( " ---------------------- " ); println(list.isEmpty()); list.clear(); println(list.isEmpty()); println( " ---------------------- " ); list.add( " jack " ); list.add( 43 ); list.add( true ); var list2 = new ArrayList(); list2.addAll(list); println(list2); println( " ---------------------- " ); list2.insert( 1 , " male " ); println(list2); println( " ---------------------- " ); list2.removeValue( true ); println(list2); println( " ---------------------- " ); list2.insertAll( 2 ,list); println(list2); println( " ---------------------- " ); println(list2.contains( " jack " )); println( " ---------------------- " ); list2.clear(); list2.add( 1111 ); list2.add( 222 ); list2.add( 33 ); list2.add( 4 ); list2.sort(); // 按字母顺序排 println(list2); println( " ---------------------- " ); list2.sort( true ); // 按数字顺序排 println(list2); println( " ---------------------- " ); } </ script > </ head > < body > </ body > </ html >
输出结果如下:
jack
43
true
null
----------------------
3
[jack,43]
----------------------
false
true
----------------------
[jack,43,true]
----------------------
[jack,male,43,true]
----------------------
[jack,male,43]
----------------------
[jack,male,jack,43,true,43]
----------------------
true
----------------------
[1111,222,33,4]
----------------------
[4,33,222,1111]
----------------------