Làm thế nào để có được subarray từ mảng?


263

Tôi có var ar = [1, 2, 3, 4, 5]và muốn một số chức năng getSubarray(array, fromIndex, toIndex), kết quả của cuộc gọi getSubarray(ar, 1, 3)là mảng mới [2, 3, 4].


10
Bạn đã thử lát chưa?
Tom Knapen

Câu trả lời:


408

Hãy xem Array.slice(begin, end)

const ar  = [1, 2, 3, 4, 5];

// slice from 1..3 - add 1 as the end index is not included

const ar2 = ar.slice(1, 3 + 1);

console.log(ar2);


22
Có lẽ đáng để đề cập rõ ràng ở đây rằng bản gốc arlà không thay đổi. console.log(ar); // -> [1, 2, 3, 4, 5]
daemonexmachina

17

Để sử dụng đơn giản slice, hãy sử dụng tiện ích mở rộng của tôi cho Lớp Array:

Array.prototype.subarray = function(start, end) {
    if (!end) { end = -1; } 
    return this.slice(start, this.length + 1 - (end * -1));
};

Sau đó:

var bigArr = ["a", "b", "c", "fd", "ze"];

Kiểm tra1 :

bigArr.subarray(1, -1);

<["b", "c", "fd", "ze"]

Kiểm tra 2:

bigArr.subarray(2, -2);

<["c", "fd"]

Kiểm tra 3:

bigArr.subarray(2);

<["c", "fd", "ze"]

Có thể dễ dàng hơn cho các nhà phát triển đến từ ngôn ngữ khác (ví dụ Groovy).



K_7 đã nói gì; đặc biệt nhất, khỉ vá các bản dựng (Object, Array, Promise, v.v.) rất nghịch ngợm. Xem ví dụ nổi tiếng về MooTools buộc phải đổi tên bản địa được đề xuất Array.prototype.containsthành Array.prototype.includes.
daemonexmachina

Chưa kể, subarrayphương pháp của bạn mang lại kết quả bất ngờ. bigArr.slice(1,-1)trả về ['b','c','fd'], mà bạn mong đợi (-1 gõ một phần tử ở cuối mảng mới). Nhưng bigArr.subarray(1,-1)trả về giống như bigArr.subarray(1), đó là nói tất cả mọi thứ từ vị trí 1 đến cuối bigArr. Bạn cũng buộc người dùng luôn đưa ra số âm làm endtham số. Bất kỳ end >= -1cho kết quả tương tự như khi end === undefined. Mặt khác, bigArr.slice(1,3)trả lại ['b','c'], mà một lần nữa được mong đợi.
daemonexmachina

5

const array_one = [11, 22, 33, 44, 55];
const start = 1;
const end = array_one.length - 1;
const array_2 = array_one.slice(start, end);
console.log(array_2);


nó không biên dịch ở đây phần chỉnh sửa: var Array_one = [11, 22, 33, 44,55]; var ar2 = mảng_one.slice (0, mảng_one.length-1); console.log (ar2)
bormat

0

Câu hỏi thực sự là yêu cầu một mảng Mới , vì vậy tôi tin rằng một giải pháp tốt hơn sẽ là kết hợp câu trả lời của Abdennour TOUMI với chức năng nhân bản:

function clone(obj) {
  if (null == obj || "object" != typeof obj) return obj;
  const copy = obj.constructor();
  for (const attr in obj) {
    if (obj.hasOwnProperty(attr)) copy[attr] = obj[attr];
  }
  return copy;
}

// With the `clone()` function, you can now do the following:

Array.prototype.subarray = function(start, end) {
  if (!end) {
    end = this.length;
  } 
  const newArray = clone(this);
  return newArray.slice(start, end);
};

// Without a copy you will lose your original array.

// **Example:**

const array = [1, 2, 3, 4, 5];
console.log(array.subarray(2)); // print the subarray [3, 4, 5, subarray: function]

console.log(array); // print the original array [1, 2, 3, 4, 5, subarray: function]

[ http://stackoverflow.com/questions/728360/ most-elant-way-to-clone-a-javascript -object]


9
Tôi không nghĩ rằng lát cắt sẽ thay đổi mảng ban đầu.
Mani

10
Array.prototype.slicetrả về một bản sao Array.prototype.spliceSửa đổi mảng ban đầu.
Guido Bouman

2
Phương thức lát () trả về một bản sao nông của một phần của mảng thành một đối tượng mảng mới. Xem Mạng nhà phát triển Mozilla . Bị hạ bệ.
TheCrazyProgrammer

Như những người khác đã nói, sliceđã trả về một bản sao nông, làm cho việc subarraythực hiện này không cần thiết. Nhưng điều đáng nói là bạn đã vá một vật thể dựng sẵn, một thứ không lớn. Xem các bình luận về câu trả lời của Abdennour TOUMI .
daemonexmachina
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.