var index = list.findIndex(item => item.name === "three")
list = list.setIn([index, "count"], 4)
Giải trình
Cập nhật các bộ sưu tập Immutable.js luôn trả về các phiên bản mới của các bộ sưu tập đó không thay đổi bản gốc. Do đó, chúng tôi không thể sử dụng list[2].count = 4
cú pháp đột biến của JavaScript . Thay vào đó, chúng ta cần gọi các phương thức, giống như chúng ta có thể làm với các lớp bộ sưu tập Java.
Hãy bắt đầu với một ví dụ đơn giản hơn: chỉ đếm trong một danh sách.
var arr = [];
arr.push(2);
arr.push(1);
arr.push(2);
arr.push(1);
var counts = Immutable.List.of(arr);
Bây giờ nếu chúng tôi muốn cập nhật mục thứ 3, một mảng JS đơn giản có thể trông như : counts[2] = 4
. Vì chúng ta không thể sử dụng đột biến và cần gọi một phương thức, thay vào đó chúng ta có thể sử dụng: counts.set(2, 4)
- điều đó có nghĩa là đặt giá trị 4
tại chỉ mục 2
.
Cập nhật sâu
Ví dụ bạn đưa ra có dữ liệu lồng nhau mặc dù. Chúng tôi không thể chỉ sử dụng set()
trên bộ sưu tập ban đầu.
Các bộ sưu tập của Immutable.js có một nhóm các phương thức có tên kết thúc bằng "In" cho phép bạn thực hiện các thay đổi sâu hơn trong một tập hợp lồng nhau. Hầu hết các phương pháp cập nhật phổ biến đều có phương thức "Trong" liên quan. Ví dụ cho set
có setIn
. Thay vì chấp nhận một chỉ mục hoặc khóa làm đối số đầu tiên, các phương thức "Trong" này chấp nhận "đường dẫn chính". Đường dẫn khóa là một mảng các chỉ mục hoặc khóa minh họa cách lấy giá trị bạn muốn cập nhật.
Trong ví dụ của bạn, bạn muốn cập nhật mục trong danh sách ở chỉ mục 2, và sau đó giá trị tại khóa "đếm" trong mục đó. Vì vậy, con đường chính sẽ là [2, "count"]
. Tham số thứ hai cho setIn
phương thức hoạt động giống như set
, đó là giá trị mới mà chúng tôi muốn đặt ở đó, vì vậy:
list = list.setIn([2, "count"], 4)
Tìm đúng đường dẫn chính
Đi thêm một bước nữa, bạn thực sự nói rằng bạn muốn cập nhật mục có tên là "ba" , khác với mục thứ 3. Ví dụ: có thể danh sách của bạn không được sắp xếp hoặc có thể có mục "hai" đã bị xóa trước đó? Điều đó có nghĩa là trước tiên chúng ta cần đảm bảo rằng chúng ta thực sự biết đường dẫn chính xác! Để làm điều này, chúng ta có thể sử dụng findIndex()
phương thức (bằng cách này, hoạt động gần như chính xác như Array # find Index ).
Khi chúng tôi đã tìm thấy chỉ mục trong danh sách có mục chúng tôi muốn cập nhật, chúng tôi có thể cung cấp đường dẫn chính đến giá trị chúng tôi muốn cập nhật:
var index = list.findIndex(item => item.name === "three")
list = list.setIn([index, "count"], 4)
NB: Set
vsUpdate
Câu hỏi ban đầu đề cập đến các phương thức cập nhật hơn là các phương thức thiết lập. Tôi sẽ giải thích đối số thứ hai trong hàm đó (được gọi updater
), vì nó khác với set()
. Trong khi đối số thứ hai set()
là giá trị mới mà chúng ta muốn, thì đối số thứ hai update()
là hàm chấp nhận giá trị trước đó và trả về giá trị mới mà chúng ta muốn. Sau đó, updateIn()
là biến thể "Trong" update()
chấp nhận đường dẫn chính.
Ví dụ: chúng tôi muốn một biến thể của ví dụ của bạn không chỉ đặt số đếm thành 4
, mà thay vào đó, tăng số đếm hiện có, chúng tôi có thể cung cấp một hàm thêm một giá trị vào giá trị hiện có:
var index = list.findIndex(item => item.name === "three")
list = list.updateIn([index, "count"], value => value + 1)