Як легко обрізати масив за допомогою JavaScript?


102

У Linq є зручний метод оператора, покликаний Take()повернути задану кількість елементів у будь-що, що реалізується IEnumerable. Чи є щось подібне в jQuery для роботи з масивами?

Або запитують інакше: як я можу врізати масив у Javascript?


22
Хлопці, будь ласка, вивчіть JavaScript перед jQuery. Боюся, завтра будуть запитання: "Які ще типи даних jQuery виставляє біля масивів?".
Ionuț G. Stan

Відповіді:


184

Існує метод зрізів

array.slice(0, 4);

Поверне перші чотири елементи.

Не забувайте присвоювати його назад своїй змінній, якщо ви хочете відкинути інші значення.

Примітка. Це просто звичайний javascript, не потрібно в jquery.


15
Не хотів би (0,4) повернути перші 4, а не перші 5?
Саймон тримай

11
Це насправді не так. Simon Keep правильний - другим аргументом методу .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

6
погано, ви створюєте новий екземпляр масиву, майте на увазі використання пам'яті, коли кодування js - не погана ідея.
Г. Гез

125

(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
Це напрочуд просте рішення.
Домінік

3
Що з тим, що збирання сміття робить це?
Г. Гез

1
@JonathanM Насправді нульові значення не вводяться; нові змінні не визначені, оскільки вони оголошені, але не присвоєні жодним значенням.
Håvard Geithus

3
Дивовижний! Варто сказати, що цей метод модифікує той самий Arrayзамість створення нового Array.
Кімнатний

22

Якщо ви запитуєте, як обрізати (змінити масив, видаливши елементи з кінця), тоді використовуйте зрощення :

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
вбити всі елементи в масиві, встановити довжину в нуль найпростіше.
hanmari

5

Якщо ви хочете отримати як елементи, так і видалити їх з масиву, використовуйте зрощення .

Якщо ви хочете зберегти елементи в масиві, використовуйте фрагмент


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.