Как легко усечь массив с помощью JavaScript?


103

Linq имеет удобный метод оператора, вызываемый Take()для возврата заданного количества элементов во всем, что реализует IEnumerable. Есть ли что-нибудь подобное в jQuery для работы с массивами?

Или, спросили по-другому: как я могу обрезать массив в Javascript?


22
Ребята, пожалуйста, изучите JavaScript перед jQuery. Боюсь, завтрашний вопрос будет: «Какие еще типы данных jQuery предоставляет помимо массивов?».
Ionuț G. Stan

Ответы:


185

Есть метод нарезки

array.slice(0, 4);

Вернет первые четыре элемента.

Не забудьте вернуть его в свою переменную, если хотите отбросить другие значения.

Примечание. Это обычный javascript, в jquery нет необходимости.


15
Не вернет ли (0,4) первые 4, а не первые 5?
Саймон Кип,

11
На самом деле это не так. Саймон Кип прав - второй аргумент метода .slice () - это позиция массива после последнего возвращаемого элемента. array.slice (0, 4) вернет элементы 0, 1, 2 и 3 - всего 4 элемента. Подумайте о втором аргументе как о точке отсечения, где .slice (0, x) вернет все элементы с начала массива до, но не включая x.
Bungle

1
endНЕ включен, тогда @SimonKeep прав, см. MDN developer.mozilla.org/en-US/docs/JavaScript/Reference/…
AsTeR

2
Не забудьте присвоить его переменной, это очень важно и просто, как может показаться
kolexinfos 01

6
плохой способ, вы создаете новый экземпляр массива, имейте в виду, что использование памяти при кодировании js - неплохая идея.
Г. Гез

126

(2 года спустя ...) Если вы действительно хотите усечь массив, вы также можете использовать lengthатрибут:

var stooges = ["Moe", "Larry", "Shemp", "Curly", "Joe"];
stooges.length = 3; // now stooges is ["Moe", "Larry", "Shemp"]

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

var stooges = ["Moe", "Larry", "Shemp"];
stooges.length = 5;
alert(typeof stooges[4]); // alerts "undefined"

РЕДАКТИРОВАТЬ:

Как указано ниже в @twhitehead, добавления неопределенных элементов можно избежать, выполнив следующие действия:

var stooges = ["Moe", "Larry", "Shemp"];
stooges.length = Math.min(stooges.length, 5); 
alert(stooges.length)// alerts "3"

5
Сначала я был удивлен, когда увидел это в коде ... Но это лучший способ (если вы выполняете усечение с индекса 0) davidwalsh.name/empty-array
kumarharsh

5
Это удивительно простое решение.
Dominique

3
А как насчет сборки мусора таким образом?
G. Ghez

1
@JonathanM На самом деле нулевые значения не вводятся; новые переменные не определены, поскольку они объявлены, но не имеют никакого значения.
Håvard Geithus

3
Удивительный! Стоит сказать, что этот метод модифицирует то же самое, Arrayа не создает новый Array.
Просторный

22

Если вы спрашиваете, как обрезать (изменить массив, удалив элементы с конца), используйте splice :

var a1 = [2,4,6,8];
var a2 = a1.splice(-2,2); // a1=[2,4], a2=[6,8]

Если вы спрашиваете, как получить подмножество массива без изменения оригинала, используйте срез .

var a1 = [2,4,6,8];
var a2 = a1.slice(-2); // a1=[2,4,6,8], a2=[6,8]

Просто помните, что сращивание модифицируется, срезается доступ. Отрицательные числа в качестве первого аргумента указывают индекс с конца массива.


11

Установите для свойства .length более низкое значение.

Официальная документация: Array.prototype.length


3
чтобы уничтожить все элементы в массиве, проще всего установить длину равной нулю.
Ханмари

5

Если вы хотите как получить элементы, так и удалить их из массива, используйте splice .

Если вы хотите сохранить элементы в массиве, используйте срез


1

Если вы хотите выборочно извлекать элементы из массива, вы можете использовать метод jQuery.grep .

(из документации jQuery)

var arr = [ 1, 9, 3, 8, 6, 1, 5, 9, 4, 7, 3, 8, 6, 9, 1 ];

$("div").text(arr.join(", "));

arr = jQuery.grep(arr, function(n, i){
  return (n != 5 && i > 4);
});

$("p").text(arr.join(", "));

arr = jQuery.grep(arr, function (a) { return a != 9; });
$("span").text(arr.join(", "));
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.