Массив push, unshift, pop, реализация метода сдвига

опрос

Хвост добавить (push)

push() 方法将一个或多个元素添加到数组的末尾,并返回该数组的新长度。

Как видно из объяснения, методу push нужно только поместить добавляемые элементы в конец массива в определенной последовательности, и он не изменит индекс исходных элементов массива. Итак, зациклите список параметров и по очереди поместите новые элементы в конец массива.

Array.prototype._push = function(...value) { for (var i = 0; i < arguments.length; i++) {  
 this[this.length] = arguments[i]  
 } return this.length  
}  
var arr = [1, 2, 3, 4]arr._push(9, 8)  
console.log(arr) // [ 1, 2, 3, 4, 9, 8 ]  

Голова добавить (снять сдвиг)

unshift() 方法将一个或多个元素添加到数组的开头,并返回该数组的新长度(该方法修改原有数组)。

Добавление элементов в голову массива изменит длину массива, но в отличие от операции добавления в конец, индекс исходного элемента массива не изменится. Чтобы добавить заголовок, вам нужно переместить индекс исходного элемента вправо.
Например, если добавляется только один бит, индекс каждого элемента массива нужно сдвигать вправо по одному, считая, что исходная длина массива равна 4, а элемент добавляется в голову, а длина становится 5.

Итак, теперь это становится:array.length = 5, и в настоящее время **массив[5 - 1]** является последним элементом, и теперь он движется назад по порядку, поэтому,array[5]должен быть последним элементом
Таким образом, мы можем зациклиться на последнем бите массива,
массив [i] назначается как массив [i - 1]
, цикл останавливается на 1 и присваивает 0-му элементу массива значение, которое необходимо добавить.

Процесс выглядит следующим образом

Конкретная реализация кода:

Array.prototype._unshift = function(value) { for (let i = this.length; i > 0; i--) {  
 this[i] = this[i - 1] } this[0] = value return this.length 
}  
var arr = [1, 2, 3, 4]arr._unshift(8)  
  
console.log(arr); // [ 8, 1, 2, 3, 4 ]  

Но приведенный выше код реализует добавление только одного элемента, а метод unshift поддерживает добавление нескольких элементов. Например:

var arr = [1, 2, 3, 4]arr.unshift(8, 7)  
console.log(arr); // [ 8, 7, 1, 2, 3, 4 ]  

В ответ на такую ​​ситуацию вам нужно знать, сколько параметров передается.Вы можете начать с объекта arguments.Идея та же, что и выше:
先以最后生成的数组长度为基准从后往前循环,依次移动元素,然后将新元素依次放到数组的头部

Длина нового массива равна длине исходного массива + количество параметров, выполнить цикл сзади вперед, переместить последнюю цифру исходного массива в последнюю цифру нового массива,
Т.к. в голову необходимо вставить элементы равные количеству входных параметров, то начальная точка цикла это длина исходного массива + количество параметров, а конечная точка цикла это количество входных параметров .
Но поскольку индекс всегда на один бит меньше длины, и начальную, и конечную точки необходимо уменьшить на 1.

Теперь можно сначала написать логику кругового движения

Array.prototype._unshift = function(...value) { for (var i = (this.length + arguments.length - 1); i > arguments.length - 1; i--) { this[i] = this[i - arguments.length]  
 }}  

Подумайте еще раз, так как предыдущий шаг был перемещен, позиция головы массива освободилась, а второй шаг — это вставка нескольких элементов с несколькими параметрами. Итак, теперь нам просто нужно перебрать вставки:

 for(var k = 0; k < arguments.length; k++) {  
 this[k] = arguments[k]  
 }

Полный код выглядит следующим образом:

Array.prototype._unshift = function(...value) { for (var i = (this.length + arguments.length - 1); i > arguments.length - 1; i--) { this[i] = this\[i - arguments.length]  
 } for(var k = 0; k < arguments.length; k++) {  
 this[k] = arguments[k] } return this.length  
}  
var arr = [1, 2, 3, 4\]arr._unshift(9, 8)  
console.log(arr); // [ 9, 8, 1, 2, 3, 4 ]  

удаление хвоста (поп)

pop() 方法将删除 arrayObject 的最后一个元素,把数组长度减 1,并且返回它删除的元素的值。如果数组已经为空,则 pop() 不改变数组, 并返回 undefined 值。

Это очень легко реализовать, и это можно сделать шаг за шагом в соответствии с определением. Сначала запишите последний элемент для удобства возврата, затем удалите последний элемент из массива,
Отпустите его, чтобы он указывал на ноль, затем уменьшите длину массива на 1 и, наконец, оцените, является ли он пустым массивом.

Array.prototype._pop = function () {
  if (!this.length) {  
    return undefined  
  }
  var end = this[this.length - 1]
  this[this.length - 1] = null
  this.length = this.length - 1
  return end
}  
  
var arr = [1, 2, 3, 4]arr._pop()  
console.log(arr); // [ 1, 2, 3 ]  
  

Удаление головы (сдвиг)

shift() 方法用于把数组的第一个元素从其中删除,并返回第一个元素的值。

Удаление головы изменит индекс исходного элемента массива, то есть индекс элемента, который не был удален, будет сдвинут влево на одну позицию.Во-первых, удаленный элемент должен быть записан для удобства возврата, и тогда первый элемент массива будет указывать на null ,
Наконец, зациклите массив, перемещая индекс.

Array.prototype._shift = function () { if (!this.length) {  
 return undefined  
 } var start = this[0] this[0] = null for(var i = 0; i < this.length - 1; i++) { this[i] = this[i + 1] } this.length = this.length - 1 return start}  
  
var arr = [1, 2, 3, 4]arr._shift()  
console.log(arr); // [ 2, 3, 4 ]