JavaScript Array splice vs lát


190

Sự khác biệt giữa splicevà là slicegì?

$scope.participantForms.splice(index, 1);
$scope.participantForms.slice(index, 1);

2
Splice và Slice là các lệnh Javascript tích hợp - không cụ thể là các lệnh AngularJS. Slice trả về các phần tử mảng từ "bắt đầu" cho đến trước khi chỉ định "kết thúc". Splice làm thay đổi mảng thực tế và bắt đầu từ "bắt đầu" và giữ số lượng phần tử được chỉ định. Google có rất nhiều thông tin về điều này, chỉ cần tìm kiếm.
di chuyển

1
kiểm tra xem cái gạt này có giúp bạn stackoverflow.com/questions/1777705/ không
Fábio Luiz

Câu trả lời:


257

splice()thay đổi mảng ban đầu trong khi slice()không nhưng cả hai đều trả về đối tượng mảng.

Xem các ví dụ dưới đây:

var array=[1,2,3,4,5];
console.log(array.splice(2));

Điều này sẽ trở lại [3,4,5]. Các mảng ban đầu bị ảnh hưởng dẫn đến arraybị [1,2].

var array=[1,2,3,4,5]
console.log(array.slice(2));

Điều này sẽ trở lại [3,4,5]. Các mảng ban đầu KHÔNG bị ảnh hưởng với kết quả array[1,2,3,4,5].

Dưới đây là fiddle đơn giản xác nhận điều này:

//splice
var array=[1,2,3,4,5];
console.log(array.splice(2));

//slice
var array2=[1,2,3,4,5]
console.log(array2.slice(2));


console.log("----after-----");
console.log(array);
console.log(array2);


20
Điều quan trọng nữa là phải quan sát rằng phương thức mảng lát () có thể được sử dụng để sao chép mảng bằng cách không truyền bất kỳ đối số nàoarr1 = arr0.slice()
Mg Gm

3
Bạn có thể nghĩ về nó giống splicenhư một chính phủ lấy thuế từ bạn. Trong khi đó slicelà một anh chàng sao chép-dán.
radbyx

.splice()cực kỳ không trực quan, tôi chỉ mất nhiều năm cố gắng tìm hiểu tại sao các tham chiếu đến mảng ban đầu lại quay trở lại undefinedcho đến khi tôi tìm thấy chủ đề này.
Nixinova

60

Splice và Slice đều là các hàm Javascript Array.

Mối nối vs Lát

  1. Phương thức splice () trả về (các) mục bị loại bỏ trong một mảng và phương thức lát () trả về (các) phần tử được chọn trong một mảng, như là một đối tượng mảng mới.

  2. Phương thức splice () thay đổi mảng ban đầu và phương thức lát () không thay đổi mảng ban đầu.

  3. Phương thức splice () có thể lấy n số lượng đối số và phương thức lát () lấy 2 đối số.

Splice với ví dụ

Luận điểm 1: Chỉ mục, Bắt buộc. Một số nguyên chỉ định tại vị trí cần thêm / xóa các mục, Sử dụng các giá trị âm để chỉ định vị trí từ cuối mảng.

Luận điểm 2: Tùy chọn. Số lượng các mặt hàng sẽ được gỡ bỏ. Nếu được đặt thành 0 (không), sẽ không có mục nào bị xóa. Và nếu không được thông qua, tất cả (các) mục từ chỉ mục được cung cấp sẽ bị xóa.

Luận cứ 3 Vòng n: Tùy chọn. (Các) mục mới sẽ được thêm vào mảng.

var array=[1,2,3,4,5];
console.log(array.splice(2));
// shows [3, 4, 5], returned removed item(s) as a new array object.
 
console.log(array);
// shows [1, 2], original array altered.
 
var array2=[6,7,8,9,0];
console.log(array2.splice(2,1));
// shows [8]
 
console.log(array2.splice(2,0));
//shows [] , as no item(s) removed.
 
console.log(array2);
// shows [6,7,9,0]

Lát với ví dụ

Luận điểm 1: Bắt buộc. Một số nguyên chỉ định nơi bắt đầu lựa chọn (Phần tử đầu tiên có chỉ số là 0). Sử dụng số âm để chọn từ cuối mảng.

Luận điểm 2: Tùy chọn. Một số nguyên chỉ định nơi kết thúc lựa chọn nhưng không bao gồm. Nếu được bỏ qua, tất cả các phần tử từ vị trí bắt đầu và đến cuối mảng sẽ được chọn. Sử dụng số âm để chọn từ cuối mảng.

var array=[1,2,3,4,5]
console.log(array.slice(2));
// shows [3, 4, 5], returned selected element(s).
 
console.log(array.slice(-2));
// shows [4, 5], returned selected element(s).
console.log(array);
// shows [1, 2, 3, 4, 5], original array remains intact.
 
var array2=[6,7,8,9,0];
console.log(array2.slice(2,4));
// shows [8, 9]
 
console.log(array2.slice(-2,4));
// shows [9]
 
console.log(array2.slice(-3,-1));
// shows [8, 9]
 
console.log(array2);
// shows [6, 7, 8, 9, 0]


3
Mặc dù cả hai hàm thực hiện các nhiệm vụ khá khác nhau, nhưng không giống nhau splice(x,y), trong slice(x,y)đối số thứ hai ykhông được tính từ vị trí của x, mà từ phần tử đầu tiên của mảng.
Ramesh Pareek

Một điều nữa tôi lưu ý: thay vì array.slice(index, count), nếu bạn sử dụng array.slice((index, count)), bạn sẽ nhận được phần còn lại sau khi 'cắt lát'. Thử nó!
Ramesh Pareek

23

Phương thức lát () trả về một bản sao của một phần của mảng thành một đối tượng mảng mới.

$scope.participantForms.slice(index, 1);

Điều này KHÔNG thay đổi participantFormsmảng nhưng trả về một mảng mới chứa phần tử đơn được tìm thấy tại indexvị trí trong mảng ban đầu.

Phương thức splice () thay đổi nội dung của một mảng bằng cách loại bỏ các phần tử hiện có và / hoặc thêm các phần tử mới.

$scope.participantForms.splice(index, 1);

Điều này sẽ loại bỏ một phần tử khỏi participantFormsmảng tại indexvị trí.

Đây là các hàm riêng của Javascript, AngularJS không liên quan gì đến chúng.


Bất cứ ai cũng có thể đưa ra ví dụ hữu ích và những gì sẽ là lý tưởng cho mỗi? Giống như các tình huống mà bạn thích sử dụng mối nối hoặc lát?
petrosmm

1
Câu trả lời này là một phần không chính xác. đối với đối splicesố thứ 2 là số phần tử trong mảng trả về, nhưng đối với đối slicesố thứ 2 là chỉ số của phần tử cuối cùng trả về + 1. slice(index,1)không nhất thiết phải trả về một mảng của một phần tử bắt đầu từ index. [1,2,3,4,5].slice(0,1)trả về [1]nhưng [1,2,3,4,5].slice(3,1)trả về []1được hiểu là như final index +1vậy final index = 0nhưng đây là trước khi start index = 3mảng trống được trả về.
BaltoStar

Tại sao đây không phải là câu trả lời hàng đầu?
JJ Labajo

23

Đây là một mẹo đơn giản để ghi nhớ sự khác biệt giữa slicevssplice

var a=['j','u','r','g','e','n'];

// array.slice(startIndex, endIndex)
a.slice(2,3);
// => ["r"]

//array.splice(startIndex, deleteCount)
a.splice(2,3);
// => ["r","g","e"]

Trick to remember:

Hãy suy nghĩ "spl" (first 3 letters of splice)ngắn gọn về "độ dài cụ thể", rằng đối số thứ hai phải là độ dài không phải là một chỉ mục


1
Đó không chỉ là cách bạn xác định đối số. Một trong số chúng (splice) sửa đổi mảng cơ sở và cái còn lại thì không.
Trọng tài

cũng có thể nghĩ về mối nối như chia (tạo 2 mảng) + lát

14

Splice - Tham chiếu MDN - Thông số ECMA-262

Cú pháp
array.splice(start[, deleteCount[, item1[, item2[, ...]]]])

Thông số

  • start: cần thiết. Chỉ số ban đầu.
    Nếu startlà âm, nó được xử lý "Math.max((array.length + start), 0)"theo thông số kỹ thuật (ví dụ được cung cấp dưới đây) một cách hiệu quả từ cuối array.
  • deleteCount: không bắt buộc. Số phần tử được loại bỏ (tất cả từ startnếu không được cung cấp).
  • item1, item2, ...: không bắt buộc. Các yếu tố được thêm vào mảng từ startchỉ mục.

Trả về : Một mảng có các phần tử bị xóa (mảng trống nếu không xóa)

Đột biến mảng ban đầu : Có

Ví dụ:

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

// Remove first element
console.log('Elements deleted:', array.splice(0, 1), 'mutated array:', array);
// Elements deleted: [ 1 ] mutated array: [ 2, 3, 4, 5 ]

// array = [ 2, 3, 4, 5]
// Remove last element (start -> array.length+start = 3)
console.log('Elements deleted:', array.splice(-1, 1), 'mutated array:', array);
// Elements deleted: [ 5 ] mutated array: [ 2, 3, 4 ]

Thêm ví dụ trong ví dụ MDN Splice


Lát - Tham chiếu MDN - Thông số ECMA-262

Thông số cú pháp
array.slice([begin[, end]])

  • begin: không bắt buộc. Chỉ số ban đầu (mặc định 0).
    Nếu beginlà âm, nó được xử lý "Math.max((array.length + begin), 0)"theo thông số kỹ thuật (ví dụ được cung cấp dưới đây) một cách hiệu quả từ cuối array.
  • end: không bắt buộc. Chỉ mục cuối cùng để trích xuất nhưng không bao gồm (mảng mặc định.length). Nếu endlà âm, nó được xử lý "Math.max((array.length + begin),0)"theo thông số kỹ thuật (ví dụ được cung cấp dưới đây) một cách hiệu quả từ cuối array.

Trả về : Một mảng chứa các phần tử được trích xuất.

Bản gốc đột biến : Không

Ví dụ:

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

// Extract first element
console.log('Elements extracted:', array.slice(0, 1), 'array:', array);
// Elements extracted: [ 1 ] array: [ 1, 2, 3, 4, 5 ]

// Extract last element (start -> array.length+start = 4)
console.log('Elements extracted:', array.slice(-1), 'array:', array);
// Elements extracted: [ 5 ] array: [ 1, 2, 3, 4, 5 ]

Các ví dụ khác trong các ví dụ về MDN Slice

So sánh hiệu suất

Đừng coi đây là sự thật tuyệt đối vì tùy thuộc vào từng kịch bản, người ta có thể thực hiện hơn kịch bản khác.
Kiểm tra hiệu suất


12

Splice và Slice là các lệnh Javascript tích hợp - không cụ thể là các lệnh AngularJS. Slice trả về các phần tử mảng từ "bắt đầu" cho đến trước khi chỉ định "kết thúc". Splice làm thay đổi mảng thực tế và bắt đầu từ "bắt đầu" và giữ số lượng phần tử được chỉ định. Google có rất nhiều thông tin về điều này, chỉ cần tìm kiếm.


2
Splice xóa số lượng được chỉ định và sau đó chèn bất kỳ đối số tiếp theo.
Josiah Keller

mối nối xóa một số phần tử đã cho khỏi một chỉ số bắt đầu đã cho, ví dụ như splice (4,1); xóa một phần tử bắt đầu từ chỉ số 4 trong khi mối nối (4.3); xóa ba phần tử bắt đầu bằng phần tử tại chỉ mục 4. Sau đó, sau khi xóa chúng, nó trả về các giá trị bị xóa.
briancollins081

7

Các splice()phương thức trả về các mục gỡ bỏ trong một mảng. Các slice()phương pháp lợi nhuận là yếu tố được lựa chọn (s) trong một mảng, như một đối tượng mảng mới.

Các splice()phương pháp làm thay đổi mảng gốc và slice()phương pháp không làm thay đổi mảng gốc.

  • Splice() phương thức có thể lấy n số đối số:

    Luận điểm 1: Chỉ mục, Bắt buộc.

    Luận điểm 2: Tùy chọn. Số lượng các mặt hàng sẽ được gỡ bỏ. Nếu được đặt thành 0 (không), sẽ không có mục nào bị xóa. Và nếu không được thông qua, tất cả (các) mục từ chỉ mục được cung cấp sẽ bị xóa.

    Luận điểm 3..n: Tùy chọn. (Các) mục mới sẽ được thêm vào mảng.

  • slice() phương thức có thể lấy 2 đối số:

    Luận điểm 1: Bắt buộc. Một số nguyên chỉ định nơi bắt đầu lựa chọn (Phần tử đầu tiên có chỉ số là 0). Sử dụng số âm để chọn từ cuối mảng.

    Luận điểm 2: Tùy chọn. Một số nguyên chỉ định nơi kết thúc lựa chọn. Nếu được bỏ qua, tất cả các phần tử từ vị trí bắt đầu và đến cuối mảng sẽ được chọn. Sử dụng số âm để chọn từ cuối mảng.


4

mối nối và xóa mục Array theo chỉ mục

chỉ số = 2

//splice & will modify the origin array
const arr1 = [1,2,3,4,5];
//slice & won't modify the origin array
const arr2 = [1,2,3,4,5]

console.log("----before-----");
console.log(arr1.splice(2, 1));
console.log(arr2.slice(2, 1));

console.log("----after-----");
console.log(arr1);
console.log(arr2);

let log = console.log;

//splice & will modify the origin array
const arr1 = [1,2,3,4,5];

//slice & won't modify the origin array
const arr2 = [1,2,3,4,5]

log("----before-----");
log(arr1.splice(2, 1));
log(arr2.slice(2, 1));

log("----after-----");
log(arr1);
log(arr2);

nhập mô tả hình ảnh ở đây


3

Một vi dụ khac:

[2,4,8].splice(1, 2) -> returns [4, 8], original array is [2]

[2,4,8].slice(1, 2) -> returns 4, original array is [2,4,8]

3

lát cắt không thay đổi mảng ban đầu, nó trả về mảng mới nhưng mối nối thay đổi mảng ban đầu.

example: var arr = [1,2,3,4,5,6,7,8];
         arr.slice(1,3); // output [2,3] and original array remain same.
         arr.splice(1,3); // output [2,3,4] and original array changed to [1,5,6,7,8].

đối số thứ hai của phương thức splice khác với phương thức lát. đối số thứ hai trong mối nối đại diện cho số lượng phần tử cần loại bỏ và trong lát cắt nó đại diện cho chỉ mục kết thúc.

arr.splice(-3,-1); // output [] second argument value should be greater then 
0.
arr.splice(-3,-1); // output [6,7] index in minus represent start from last.

-1 đại diện cho phần tử cuối cùng để nó bắt đầu từ -3 đến -1. Trên đây là sự khác biệt lớn giữa phương pháp mối nối và lát cắt.


2

//splice
var array=[1,2,3,4,5];
console.log(array.splice(2));

//slice
var array2=[1,2,3,4,5]
console.log(array2.slice(2));


console.log("----after-----");
console.log(array);
console.log(array2);


Vui lòng cung cấp thêm thông tin về những gì đang diễn ra
MKant

2

Sự khác biệt giữa các hàm xây dựng javascript Slice () và Splice () là, Slice trả về mục đã xóa nhưng không thay đổi mảng ban đầu; giống,

        // (original Array)
        let array=[1,2,3,4,5] 
        let index= array.indexOf(4)
         // index=3
        let result=array.slice(index)
        // result=4  
        // after slicing=>  array =[1,2,3,4,5]  (same as original array)

nhưng trong trường hợp splice () nó ảnh hưởng đến mảng ban đầu; giống,

         // (original Array)
        let array=[1,2,3,4,5] 
        let index= array.indexOf(4)
         // index=3
        let result=array.splice(index)
        // result=4  
        // after splicing array =[1,2,3,5]  (splicing affects original array)

0

Ví dụ về JavaScript Array splice ()

Ví dụ1 bởi tutsmake - Xóa 2 phần tử khỏi chỉ mục 1

  var arr = [ "one", "two", "three", "four", "five", "six", "seven", "eight", "nine", "ten" ]; 

 arr.splice(1,2);

 console.log( arr ); 

Ví dụ-2 Bằng tutsmake - Thêm phần tử mới từ chỉ mục 0 JavaScript

  var arr = [ "one", "two", "three", "four", "five", "six", "seven", "eight", "nine", "ten" ]; 

 arr.splice(0,0,"zero");

 console.log( arr );  

Ví dụ-3 bởi tutsmake - Thêm và xóa các thành phần trong mảng JavaScript

var months = ['Jan', 'March', 'April', 'June'];

months.splice(1, 0, 'Feb'); // add at index 1

console.log(months); 

months.splice(4, 1, 'May'); // replaces 1 element at index 4

console.log(months);

https://www.tutsmake.com/javascript-array-splice-method-by-example/

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.