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

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

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

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

img

本文我們暫不討論不改變原陣列的方法,只談改變原陣列用到的 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());

img

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)

img

unshift()

向陣列開頭增加一個或多個元素,並返回新的長度,以上就是我練習時使用的方法,感興趣的夥伴可在3A的伺服器上部署環境,自己進行開發試驗。


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)


來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/70021806/viewspace-2914133/,如需轉載,請註明出處,否則將追究法律責任。

相關文章