1. // 无序数组
    2. class List {
    3. // 1.创建空的数组 指定size
    4. constructor() {
    5. this.arr = new Array(10);
    6. this.size = 10;
    7. this.length = 0;
    8. this.realloc = () => {
    9. let new_arr = null;
    10. // 扩大
    11. if(this.length === this.size) {
    12. // 增加空间 原来数据拷贝到新数据
    13. this.size = this.size*2;
    14. new_arr = new Array(this.size);
    15. } else if(this.length < (this.size/4)) {
    16. // 判断是否需要缩小
    17. this.size = Math.floor(this.size/2);
    18. new_arr = new Array(this.size);
    19. }
    20. if(new_arr) {
    21. for(let i = 0; i < this.length; i++){
    22. new_arr[i] = this.arr[i]
    23. }
    24. delete this.arr;
    25. this.arr = new_arr;
    26. }
    27. };
    28. this.checkRange= (index) => {
    29. if(typeof index !== 'number' || index < 0 || index >= this.length) {
    30. throw new RangeError();
    31. }
    32. }
    33. }
    34. getItem(index){
    35. this.checkRange(index);
    36. return this.arr[index];
    37. }
    38. setItem(index, value) {
    39. this.checkRange(index);
    40. return this.arr[index] = value;
    41. }
    42. // 添加
    43. append(value){
    44. this.arr[this.length] = value;
    45. this.length++;
    46. // 如果超出 扩展空间
    47. this.realloc();
    48. }
    49. // 插入
    50. insert(value, pointIndex) {
    51. if(pointIndex < 0 || pointIndex > this.length) {
    52. throw new RangeError();
    53. } else if (pointIndex === this.length) {
    54. append(value);
    55. } else {
    56. // 1.index的数据都向后移动一位
    57. for(let j = this.length; j > pointIndex; j --) {
    58. this.arr[j] = this.arr[j-1];
    59. }
    60. // 2.新的数据放到 index 位置上
    61. this.arr[pointIndex] = value;
    62. this.length++;
    63. // 如果超出 扩展空间
    64. this.realloc();
    65. }
    66. }
    67. // 删除某一项
    68. delete(index) {
    69. this.checkRange(index);
    70. // 1.index的数据都向前移动一位
    71. for(let j = index; j < this.length -1; j ++) {
    72. this.arr[j] = this.arr[j+1];
    73. }
    74. this.length--;
    75. this.realloc();
    76. }
    77. // 有序的数组 二分法查找 适用于搜索性能更高
    78. search(value) {
    79. let s = 0;
    80. let e = this.arr.length - 1;
    81. while(s <= e) {
    82. let center = Math.floor((s+e)/2);
    83. if(value === this.arr[center]) {
    84. return center;
    85. } else if(value < this.arr[center]) {
    86. e = center - 1;
    87. } else {
    88. s = center + 1;
    89. }
    90. }
    91. return -1;
    92. }
    93. }
    94. // 有序数组 先继承无序数组的属性和方法
    95. class OrderList extends List{
    96. constructor() {
    97. // 继承父级
    98. super();
    99. this.adjusted = (index) => {
    100. // 调整顺序
    101. // 往前调整 我比前面小
    102. if(index > 0 && this.arr[index] < this.arr[index-1]){
    103. for (let i = index; i > 0; i --) {
    104. if(this.arr[i] < this.arr[i-1]) {
    105. let temp = this.arr[i-1];
    106. this.arr[i-1] = this.arr[i];
    107. this.arr[i] = temp;
    108. } else {
    109. break;
    110. }
    111. }
    112. } else if(index < (this.length - 1) && this.arr[index] > this.arr[index+1]) {
    113. // 往后调整 我比后面的大
    114. for (let i = index; i < (this.length - 1); i ++) {
    115. if(this.arr[i] > this.arr[i+1]) {
    116. let temp = this.arr[i+1];
    117. this.arr[i+1] = this.arr[i];
    118. this.arr[i] = temp;
    119. } else {
    120. break;
    121. }
    122. }
    123. }
    124. }
    125. }
    126. setItem(index, value) {
    127. // 先调用父级方法 然后在调用自己的方法
    128. super.setItem(index, value);
    129. this.adjusted(index);
    130. }
    131. append(value){
    132. // 先调用父级方法 然后在调用自己的方法
    133. super.append(value);
    134. this.adjusted(this.length -1);
    135. }
    136. insert(value, index){
    137. // 先调用父级方法 然后在调用自己的方法
    138. super.insert(value, index);
    139. this.adjusted(index);
    140. }
    141. }
    142. const list = new OrderList();
    143. list.append(1);
    144. list.append(9);
    145. list.append(5);
    146. list.append(2);
    147. list.append(4);
    148. list.insert(2, 1);
    149. console.log(list);