2012-08-07 54 views
6

Tôi đang cố xóa một phần tử khỏi mảng của mình bằng cách sử dụng slice, nhưng tôi không thể làm cho nó hoạt động được, xem đoạn mã này.Xóa phần tử khỏi mảng, sử dụng slice

console.log(this.activeEffects); // Prints my array 
    console.log(this.activeEffects.slice(0,1)); // Remove from index 0, and remove one. 
    console.log(this.activeEffects); // Prints array again, this time my element should be gone 

Kết quả này là.

enter image description here

Vậy điều gì là có được từ đây là, lúc đầu mảng là toàn bộ, như nó phải được. Sau đó, bản in của nó được cắt lát của mảng. Cuối cùng thứ ba nên được sản phẩm nào? hoặc là?

+1

có thể tạo ra jsfiddle cho điều này không? –

+0

Bạn có chắc đây là một mảng không? –

Trả lời

12

Tôi tin rằng bạn đang tìm kiếm splice. Từ W3 Schools:

Phương thức splice() thêm/xóa mục vào/khỏi mảng và trả về (các) mục đã xóa.

Hãy xem ví dụ trên trang đó; trường hợp sử dụng có tương tự như những gì bạn muốn đạt được.

EDIT: Alternative link to MDN, theo đề xuất của Nicosunshine; nhiều thông tin hơn về lệnh ở đó.

+13

Tôi biết tôi có thể gây phiền nhiễu, nhưng không sử dụng W3 Schools. MDN đó là một tài nguyên tốt hơn nhiều https://developer.mozilla.org/en-US/docs/JavaScript/Reference/Global_Objects/Array/splice – NicoSantangelo

+0

Cảm ơn TSL, điều này đã giải quyết được vấn đề của tôi. Tát bản thân tôi ngay bây giờ. – MartinElvar

+0

@nicosunshine đến Meta để yêu cầu chặn tự động các liên kết w3schools! – canon

5

.slice không đột biến mảng, bạn có thể sử dụng .splice() để loại bỏ các mục tại index i trong mảng:

this.activeEffects.splice(i, 1) 
+0

Nhưng tôi có thể cần phải loại bỏ một phần tử i ở giữa mảng – MartinElvar

+0

@MartinElvarJensen, tôi không nhận ra điều đó. 'shift()' là thích hợp hơn khi bạn muốn xóa ngay từ đầu. – Esailija

+0

slice không thay đổi mảng ban đầu như ông nói nhưng nó trả về các phần tử đã xóa. Tại sao không thay thế mảng ban đầu bằng các phần tử đã xóa bằng cách thực hiện một bài tập? ví dụ. this.activeEffects = this.activeEffects.slice (0,1) – Magrangs

1

Array.prototype. slice() ...

không làm thay đổi mảng ban đầu, nhưng trả về một mới "một cấp sâu" sao chép có chứa các bản sao của các yếu tố thái lát từ mảng ban đầu . Các yếu tố của các mảng ban đầu được sao chép vào mảng mới như sau:

Trong khi Array.prototype. splice() ...

Thay đổi nội dung của một mảng, thêm các yếu tố mới trong khi loại bỏ các yếu tố cũ.

Ví dụ này sẽ minh họa sự khác biệt.

// sample array 
 
var list = ["a","b","c","d"]; 
 
// slice returns a new array 
 
console.log("copied items: %o", list.slice(2)); 
 
// but leaves list itself unchanged 
 
console.log("list: %o", list); 
 
// splice modifies the array and returns a list of the removed items 
 
console.log("removed items: %o", list.splice(2)); 
 
// list has changed 
 
console.log("list: %o", list);

-1

Nhìn vào đây: http://www.w3schools.com/jsref/jsref_slice_array.asp

Bạn có thể thấy rằng phương pháp Slice Select object et ném chúng vào một đối tượng mảng mới ^^ Vì vậy, bạn không thể xóa một đối tượng như thế này, có thể bạn có thể thử một thứ như sau:

var a = ["a","b","c"]; (pseudo code) 
/* I wan't to remove the "b" object */ 

var result = a.slice(0,1)+a.slice(2,1); /* If you considers that "+" is a concatenation operator, i don't remember if it is true... */ 
3

Đây là những gì tôi có thể đến với:

var newArray = oldArray.slice(indexOfElementToRemove+1).concat(oldArray.slice(0,indexOfElementToRemove)); 
1
function removeItemWithSlice(index) { 
    return [...items.slice(0, index), ...items.slice(index + 1)] 
} 

Slice sẽ tạo ra một mảng mới.Chúng tôi tạo hai mảng: từ bắt đầu vào chỉ mục và từ chỉ mục + 1 đến kết thúc. Sau đó, chúng ta áp dụng toán tử spread (...) để lấy các mục của các mảng đó và tạo một mảng đơn mới chứa tất cả các mục mà chúng ta quan tâm. Tôi sẽ dán một cách tương đương nếu bạn không thích một lớp lót:

function removeItemWithSlice(index) { 
    const firstArr = items.slice(0, index); 
    const secondArr = items.slice(index + 1); 
    return [...firstArr , ...secondArr] 
} 
Các vấn đề liên quan