2016-02-04 26 views
18

Tôi có một mảng các đối tượng. Tôi muốn tìm một số trường và sau đó thay đổi nó:Javascript ES6/ES5 tìm thấy trong mảng và thay đổi

var item = {...} 
var items = [{id:2}, {id:2}, {id:2}]; 

var foundItem = items.find(x => x.id == item.id); 
foundItem = item; 

Tôi muốn thay đổi đối tượng gốc. Làm sao? (Tôi không quan tâm nếu nó sẽ được ở lodash quá)

Trả lời

40

Bạn có thể sử dụng findIndex để tìm index trong mảng của đối tượng và thay thế nó theo yêu cầu:

var item = {...} 
var items = [{id:2}, {id:2}, {id:2}]; 

var foundIndex = items.findIndex(x => x.id == item.id); 
items[foundIndex] = item; 

này giả định ID duy nhất. Nếu ID của bạn được nhân đôi (như trong ví dụ của bạn), nó có thể là tốt hơn nếu bạn sử dụng foreach:

items.forEach((element, index) => { 
    if(element.id === item.id) { 
     items[index] = item; 
    } 
}); 
+12

hoặc 'items.map (x => x.id == item.id? item: x) '... – georg

+5

@georg Điều đó sẽ trả về một mảng mới. – CodingIntrigue

+0

Chức năng => sẽ không hoạt động trong IE11. Gần đây bị cắn bởi điều này. –

9

tiếp cận tốt nhất của tôi là:

var item = {...} 
var items = [{id:2}, {id:2}, {id:2}]; 

items[items.findIndex(el => el.id === item.id)] = item; 

tham chiếu cho findIndex

Và trong trường hợp bạn không muốn thay thế bằng đối tượng mới, nhưng thay vì sao chép các trường của item, bạn có thể sử dụng Object.assign:

Object.assign(items[items.findIndex(el => el.id === item.id)], item)

như một sự thay thế với .map():

Object.assign(items, items.map(el=> el.id === item.id? item : el))

+0

Vui lòng liên kết tới trang tiếng Anh nếu câu hỏi ban đầu bằng tiếng Anh. Ngoài ra, ví dụ này giả định đối tượng luôn được tìm thấy. – raarts

+0

Bạn luôn có thể quấn nó trong một biểu thức thử cố gắng sau đó ... phải không? –

1

Một cách tiếp cận khác là sử dụng splice.

Trong trường hợp bạn đang làm việc với khung hoạt động, nó sẽ cập nhật "chế độ xem", mảng của bạn "biết" bạn đã cập nhật anh ấy.

Trả lời:

var item = {...} 
var items = [{id:2}, {id:2}, {id:2}]; 

let foundIndex = items.findIndex(element => element.id === item.id) 
items.splice(foundIndex, 1, item) 

Và trong trường hợp bạn chỉ muốn thay đổi một giá trị, bạn có thể sử dụng chức năng find:

// Retrieve item and assign ref to updatedItem 
let updatedItem = items.find((element) => { return element.id === item.id }) 

// Modify object property 
updatedItem.aProp = ds.aProp 
Các vấn đề liên quan