Js: последнее установленное значение и получение

#javascript #arrays #get #set

#javascript #массивы #получить #установить

Вопрос:

самый быстрый способ выбрать последний элемент из массива — это array[length - 1]

Однако, когда я получаю больший вложенный массив, я получаю что-то вроде этого:

 let last_item = pathsry[
    pathsry.length - 1
    ][
        pathsry[
            pathsry.length - 1
        ].length - 1
    ]
  

Это нехорошо, поэтому я переписал следующее, чтобы получить последнее значение.

 // get item at last index
Array.prototype.last = String.prototype.last = function(){
  return this[this.length - 1];
}
  

что позволяет мне получить

 var arr = [[1, 2], [2, 3], [['a', 'b'], ['c', 'd']]];
console.log(arr.last().last().last());
// 'd'
  

Однако, если я попытаюсь установить:

 Array.prototype.last = function(){
    return this[this.length - 1];
}

var arr = [[1, 2], [2, 3], [['a', 'b'], ['c', 'd']]];
arr.last().last().last() = 'dd';

// ReferenceError: Invalid left-hand side in assignment
  

есть ли способ, которым я могу написать функцию, которая принимает число в качестве параметра, который указывает вложенные фрагменты, и необязательный параметр заданного значения, который:

 function arrayLast(arr, nes, val){
    // ...
}

var arra = [[1, 2], [2, 3], [['a', 'b'], ['c', 'd']]];

console.log(arrayLast(arra, 3));
// d

arrayLast(arra, 3, 'dd');
console.log(arra);
// arr = [[1, 2], [2, 3], [['a', 'b'], ['c', 'dd']]]
  

спасибо за вашу помощь

Комментарии:

1. Я особенно не хочу использовать flat , поскольку это снижает производительность

Ответ №1:

Это должно помочь!

 Array.prototype.last = function(val=null) {
  if (this.length === 0) {
    if (val) this[0] = val;
    else return null; 
  }
  
  temp = this;
  while(typeof temp[temp.length-1] === "object") {
    temp = temp[temp.length-1];
  }
  
  if (val) temp[temp.length-1] = val; //Setter  
  else return temp[temp.length-1]; //Getter
  
}

var arr = [[1, 2], [2, 3], [['a', 'b'], ['c', 'd']]];
console.log(arr.last()); // 'd'
    
arr.last("dd"); 
console.log(arr); // [ [ 1, 2 ], [ 2, 3 ], [ [ 'a', 'b' ], [ 'c', 'dd' ] ] ]