众所周之,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
true
null
----------------------
[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]
----------------------
转自
水之原