2013-04-22 34 views
19

Tôi có một mảng dữ liệu như thế này:Làm cách nào để cập nhật một hàng trong một mảng javascript dựa trên giá trị khóa?

var nameInfo = [{name: "Moroni", age: 50}, 
       {name: "Tiancum", age: 43}, 
       {name: "Jacob", age: 27}, 
       {name: "Nephi", age: 29}, 
       {name: "Enos", age: 34}]; 

Nếu tôi có một đối tượng như thế này:

var nameInfo = {name: "Moroni", age: 51}; 

Có một cách đơn giản mà tôi có thể cập nhật các biến nameInfo. Khoá giữa các cột này là cột tên. Tôi biết có một cách mà tôi có thể làm điều này bằng cách tìm kiếm hàng, xóa và thêm nhưng tôi muốn để có cách để làm điều này, nơi tôi đã cập nhật hàng. Lưu ý rằng nếu nó giúp tôi có tải underscore.js.

+0

Vì vậy, các tên là duy nhất? Vậy tại sao họ không phải là _names_ cho các thuộc tính đối tượng của bạn ngay từ đầu? – CBroe

+0

Vâng tôi xin lỗi tôi nên đề cập đến. Các tên là duy nhất. –

+0

Vậy thì tôi sẽ xây dựng toàn bộ thứ đó dưới dạng '{" Moroni ": {" tuổi ": 51}}' - vì vậy bạn có thể kiểm tra sự tồn tại của một mục theo tên mà không phải lặp lại tất cả các mục. – CBroe

Trả lời

26

Cách dễ nhất là chỉ cần lặp lại và tìm ra một với một tên phù hợp sau đó cập nhật tuổi :

var newNameInfo = {name: "Moroni", age: 51}; 
var name = newNameInfo.name; 

for (var i = 0, l = nameInfo.length; i < l; i++) { 
    if (nameInfo[i].name === name) { 
     nameInfo[i].age = newNameInfo.age; 
     break; 
    } 
} 

JSFiddle Example

Sử dụng gạch dưới, bạn có thể sử dụng phương pháp _.find phải làm như sau thay cho vòng lặp for:

var match = _.find(nameInfo, function(item) { return item.name === name }) 
if (match) { 
    match.age = newNameInfo.age; 
} 

JSFiddle Example

+0

Trong ví dụ gạch dưới, tôi thấy bạn đã khai báo một biến mới có tên là "match" mà bạn đã lưu kết quả của _.find. Bây giờ bạn đã cập nhật biến "đối sánh" đó với dữ liệu đã cập nhật. Làm thế nào để mảng ban đầu là "nameInfo" đã được cập nhật. Tôi hơi mới để gạch dưới. – Achyut

+5

@Achyut Kết hợp biến là tham chiếu đến mục có liên quan trong mảng ban đầu, không phải là bản sao. Vì vậy, cập nhật cho điều này cũng là bản cập nhật cho mục gốc. –

1

Bạn có thể sử dụng phương pháp _.find, như thế này:

var nameInfos = [{name: "Moroni", age: 50}, 
       {name: "Tiancum", age: 43}, 
       {name: "Jacob", age: 27}, 
       {name: "Nephi", age: 29}, 
       {name: "Enos", age: 34}]; 
var nameToSearch = "Moroni"; 
var myRecord = _.find(nameInfos, function(record){ return record.name === nameToSearch; }); 

dụ làm việc: http://jsfiddle.net/9C2u3/

+0

Điều gì sẽ xảy ra nếu giá trị không xuất hiện! wont trở về 'undefined'? Tôi cảm thấy đây không phải là cách tốt nhất để giải quyết vấn đề này? –

4

Sử dụng dấu gạch dưới, bạn có thể sử dụng _.findWhere http://underscorejs.org/#findWhere

_.findWhere(publicServicePulitzers, {newsroom: "The New York Times"}); 
=> {year: 1918, newsroom: "The New York Times", 
    reason: "For its public service in publishing in full so many official reports, 
    documents and speeches by European statesmen relating to the progress and 
    conduct of the war."} 
9

Edit: Bạn có thể sử dụng bộ lọc ES6 kết hợp với các chức năng mũi tên

nameInfo.filter(x => {return x.name === nametofind })[0].age = newage 

Bạn có thể sử dụng chức năng _.where

var match = _.where(nameInfo , {name :nametofind }); 

sau đó cập nhật các trận đấu

match[0].age = newage 
1
var match = _.findWhere(nameInfo , {name :nametofind }); 
match.age = newage 
+0

'_.findWhere' sẽ không đủ trong senario này vì nó khớp với tất cả các cặp khóa giá trị –

6
var nameInfo = [{name: "Moroni", age: 50},{name: "Tiancum", age: 43}, 
       {name: "Jacob", age: 27},{name: "Nephi", age: 29}, 
       {name: "Enos", age: 34} 
       ]; 
_.map(nameInfo, function(obj){ 
    if(obj.name=='Moroni') { 
    obj.age=51; // Or replace the whole obj 
    } 
}); 

này nên làm điều đó. Đó là gọn gàng và đáng tin cậy và có gạch dưới

+2

Bạn không cần trả về' obj' trong hàm chuyển đổi? Nếu không, bạn sẽ nhận được một mảng các phần tử không xác định. – Sebastian

4

Bạn có thể sử dụng findWhere và mở rộng

obj = _.findWhere(@songs, {id: id}) 
_.extend(obj, {name:'foo', age:12}); 
1

Một mong staright sử dụng chức năng lodash của find(),

var nameInfo = [{name: "Moroni", age: 50}, 
      {name: "Tiancum", age: 43}, 
      {name: "Jacob", age: 27}, 
      {name: "Nephi", age: 29}, 
      {name: "Enos", age: 34}]; 

var objToUpdate = _.find(nameInfo, {name: "Moroni"}); 

if(objToUpdate) objToUpdate.age = 51; 

console.log(nameInfo); // Moroni age will be 51; 

Lưu ý: Nếu có nhiều đối tượng Moroni, _. tìm chỉ có thể tìm nạp kết quả phù hợp đầu tiên.

Các vấn đề liên quan