重寫陣列的方法(改變原陣列)

撈起月亮的漁民發表於2022-09-09

下圖是我自我學習模擬陣列時總結的一些重新陣列的方法:

本文我們暫不討論不改變原陣列的方法,只談改變原陣列用到的 6 種方法。

改變原陣列的方法

push()

按引數順序向陣列尾部新增元素,返回新陣列的長度

var color = ['red', 'green']
var color2 = color2.push(['blue','purple'])

alert(color)    // ['red', 'green']
alert(color2)    // ['red', 'green','blue','purple']

重寫:

Array.prototype._push = function() {
    for(let i = 0; i < arguments.length; i++) {
        this[this.length] = arguments[i]
    }
    return this.length
}

var arr1 = [1, 2, 3]
console.log(arr1.push(4, 5))    // 返回新陣列的長度  5
console.log(arr1._push(6, 7))   // 返回新陣列的長度  7
console.log(arr1)    // [1, 2, 3, 4, 5, 6, 7]

pop()

刪除陣列中的最後一個元素,並返回該元素

var color = ['red', 'green','blue','purple']
var color2 = color.pop()

alert(color)    // ['red','green','blue']
alert(color2)    // ['purple']
Array.prototype._pop() = function() {
    if(this.length) {
        let res = this[this.length - 1]
        delete this[this.length]
        this.length--
        return res
    }
}

let arr2 = [1, 2, 3, 4, 5]
console.log(arr2.pop())    // 返回刪除的元素 5
console.log(arr2._pop())    // 返回刪除的元素 4
console.log(arr2)    // [1, 2, 3]

sort()

預設情況下,sort() 會按照升序重新排列陣列元素,即最小的值在前面,最大的值在後面。因此,sort() 會在每一項上呼叫 string() 轉換函式,然後比較字串來決定順序。即使陣列的元素都是數值,也會先把陣列轉換成字串再比較、排序。例如:

let values = [0, 1, 5, 10, 15]
values.sort()
console.log(values)   //0,1,10,15,5

一開始陣列中的數值的順序是正確的,但是呼叫 sort() 會按照這些數值的字串形式重新排序。所以它可以接收一個比較函式,用於判斷哪個值應該排在前面。

function compare(a, b) {
   if(a < b) return -1
   else if(a > b)  return 1
   else return 0
}

這個比較函式可以適用於大多數資料型別,可以把他當做引數傳給 sort(),例如:

let values = [0, 1, 5, 10, 15]
values.sort(compare)
console.log(values)   // 0,1,5,10,15

當然,也可以使排序產生降序效果,只需要把返回值交換一下即可:

function compare(a, b) {
   if(a < b) return 1
   else if(a > b)  return -1
   else return 0
}

let values = [0, 1, 5, 10, 15]
values.sort(compare)
console.log(values)   // 15,10,5,1,0

重寫:

var arr = [4, 1, 6, 9, 3, 2, 8, 7]
var arr2 = [4, 1, 6, 9, 3, 2, 8, 7]
console.log(arr.sort());

Array.prototype.mySort = function (arr) {
   for (var i = 0; i < this.length; i++) {
      for (var j = i + 1; j < this.length; j++) {
         if (this[i] > this[j]) {
            var temp = this[i]
            this[i] = this[j]
            this[j] = temp;
         }
      }
   }
   return this
}

console.log('mySort:',arr2.mySort());

reverse()

將陣列倒敘,改變原陣列


Array.prototype.myReverse = function () {
   var left = 0,
      right = this.length - 1;

   while (left < right) {
      var temp = this[left];
      this[left] = this[right];
      this[right] = temp;
      left++;
      right--;

   }
}
var arr2 = [1, 3, 5, 7, 9]
console.log('before:', arr2)  
myReverse(arr2)
console.log('after:', arr2)

shift()

刪除陣列第一個元素,並返回該元素

var arr = [1, 3, 5, 7]
console.log(arr.unshift(9))
console.log(arr)

Array.prototype.myUnshift = function () {
   var L = this.length;
   var newArr = arguments.length
   for (var i = L + newArr - 1; i >= 0; i--) {
      if (i > newArr - 1) {
         this[i] = this[i - newArr];
      } else {
         this[i] = arguments[i];
      }
   }
   return this.length;
}

var arr2 = [1, 3, 5, 7,]

console.log('myUnshift:', arr2.myUnshift(9));
console.log('myUnshift:', arr2)

unshift()

向陣列開頭增加一個或多個元素,並返回新的長度

var arr = [1, 3, 5, 7]
console.log(arr.unshift(9))
console.log(arr)

Array.prototype.myUnshift = function () {
   var L = this.length;
   var newArr = arguments.length
   for (var i = L + newArr - 1; i >= 0; i--) {
      if (i > newArr - 1) {
         this[i] = this[i - newArr];
      } else {
         this[i] = arguments[i];
      }
   }
   return this.length;
}

var arr2 = [1, 3, 5, 7,]

console.log('myUnshift:', arr2.myUnshift(9));
console.log('myUnshift:', arr2)

推薦閱讀

一文讀懂瀏覽器儲存與快取機制

Python Type Hints 從入門到實踐

相關文章