javascript Массив, содержащий только последние N элементов

Есть ли какой-то тип данных, например массив, который содержит только последние 100 элементов? Или как это сделать самостоятельно?

Мы можем просто разрезать массив от 0 до элемента x, когда длина массива будет больше 100, но это неэффективно.


person ElSajko    schedule 13.07.2016    source источник
comment
другими словами, вам нужен массив, содержащий не более 100 элементов, и по мере добавления новых элементов самые старые удаляются.   -  person Kevin B    schedule 14.07.2016
comment
Такого встроенного типа массива нет. Как вы добавляете элементы в массив. Вы всегда можете создать свою собственную функцию/метод для добавления нового элемента в массив, который обрезал бы его, если бы он был слишком длинным.   -  person jfriend00    schedule 14.07.2016
comment
Это уже спрашивали день или два   -  person Matías Fidemraizer    schedule 14.07.2016
comment
@KevinB да, мы могли бы просто обрезать массив в начале каждый раз, когда он будет иметь более 100 (n), но это неэффективно. Возможно, подойдет связанный массив, вы просто удаляете x элементов из начала и переназначаете основной указатель. Но как это сделать в JS?   -  person ElSajko    schedule 14.07.2016
comment
обрезка, вероятно, будет лучшим вариантом. На самом деле похоже, что вы описываете обрезку. удаляя x элементов из начала массива, а затем добавляя их в конец. Конечно, создание нового массива каждый раз было бы хуже...   -  person Kevin B    schedule 14.07.2016
comment
Неэффективно по сравнению с C/C++? На самом деле JavaScript не позволяет вам возиться с указателями.   -  person Eugene Kulabuhov    schedule 14.07.2016


Ответы (2)


Вы можете использовать кольцевой буфер:

var n = 100;
var a = new Array(n);
var i = 0;

function push(x) {
   i = (i + 1) % n;
   a[i] = x;
}
person emulbreh    schedule 13.07.2016
comment
Я только что предложил использовать круговую очередь и сразу же получил отрицательный голос: P - person Jack Ryan; 14.07.2016
comment
@JackRyan разница здесь в том, что этот ответ является ответом, а ваш был просто указателем ... к java-документам ... это javascript. - person Kevin B; 14.07.2016
comment
О, спасибо @Kevin B! Должно быть, я совершил классическую ошибку, думая, что Java === JavaScript. - person Jack Ryan; 14.07.2016

Вы можете использовать push и shift:

var a = [];

function append(value) {
  a.push(value);
  while (a.length > 10) {
    a.shift();
  }
}

for (var i = 0; i < 75; i++) {
  append(i);
}

console.log(a);

// Output:
// [ 65, 66, 67, 68, 69, 70, 71, 72, 73, 74 ]
person user94559    schedule 13.07.2016
comment
неэффективно, когда вы делаете это много - person ElSajko; 14.07.2016
comment
@ElSajko По сравнению с чем? Можете ли вы поделиться своей методологией бенчмаркинга? - person user94559; 14.07.2016
comment
@ElSajko Если вам нужна производительность, вам также может потребоваться указать, какой движок JavaScript вы используете (браузер или другой). Производительность таких методов, как push и shift, значительно различается в зависимости от реализации. - person user94559; 14.07.2016
comment
хм, я изменил свой рейтинг для вашего поста, он может подойти, в начале я думал, что вы использовали сплайсинг вместо сдвига. Но что, если вы хотите добавить более одного элемента одновременно, вам придется использовать объединение, и соединение каждый раз создает новый массив. - person ElSajko; 14.07.2016
comment
вы можете нажать более одного элемента за раз, и код в этом ответе затем обрежет его до максимума. вам просто нужно немного изменить строку .push(), чтобы поддерживать несколько в любой форме, которую вы хотите. - person Kevin B; 14.07.2016
comment
@KevinB да, это правда, но тогда вам придется использовать сращивание вместо сдвига, сращивание каждый раз создает новый массив - person ElSajko; 14.07.2016
comment
Зачем тебе сплайсинг? если вы добавляете 5 элементов, вызовите сдвиг 5 раз. - person Kevin B; 14.07.2016
comment
@KevinB, как бы вы обрезали массив 120 до массива 100, не используя сращивание? циклы тоже звучат неэффективно: P - person ElSajko; 14.07.2016
comment
Правильно, но то, что вы хотите, не реализовано изначально, вам нужно чем-то жертвовать. либо сращивайте и, таким образом, создавайте новые массивы каждый раз, когда вы нажимаете, либо зацикливайте и сдвигайте. - person Kevin B; 14.07.2016