2013-04-22 13 views
19

Mam tablicę danych jak poniżej:Jak mogę zaktualizować wiersz w tablicy javascript na podstawie wartości klucza?

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

Jeśli mam obiektu takiego:

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

Czy istnieje prosty sposób, że mogę zaktualizować zmienną nameInfo. Klucz między nimi to kolumna nazwy. Wiem, że istnieje sposób, że mógłbym to zrobić, wyszukując wiersz, usuwając i dodając, ale chciałbym, aby to zrobić, gdzie zaktualizowałem wiersz. Zauważ, że jeśli to pomaga, mam załadowany plik underscore.js.

+0

Więc nazwy są unikatowe? Dlaczego więc nie są one nazwami _ dla twoich właściwości obiektów? – CBroe

+0

Tak, przykro mi, że powinienem był o tym wspomnieć. Nazwy są unikalne. –

+0

Cóż, wtedy skompilowałem całość w postaci '{" Moroni ": {" age ": 51}}' - dzięki czemu można sprawdzić istnienie wpisu po nazwie, bez konieczności zapętlenia wszystkich wpisów. – CBroe

Odpowiedz

26

Najprostszym sposobem jest po prostu pętli nad i znaleźć jedną z nazwą pasującym następnie zaktualizować wiek :

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

Używanie podkreślenia można użyć metody _.find wykonać następujące czynności zamiast pętli for:

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

JSFiddle Example

+0

W przykładzie podkreślenia widzę, że zadeklarowałeś nową zmienną o nazwie "match", w której zapisałeś wynik _.find. Teraz zaktualizowałeś zmienną "dopasuj" do zaktualizowanych danych. W jaki sposób zaktualizowano oryginalną tablicę, która jest "nameInfo". Jestem mały nowy, aby podkreślić. – Achyut

+5

@Achyut Dopasowanie zmiennych jest odniesieniem do odpowiedniego elementu w oryginalnej tablicy, a nie do kopii. Zatem aktualizacje tego są również aktualizacjami oryginalnego elementu. –

1

Można użyć metody _.find, tak:

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; }); 

przykład robocza: http://jsfiddle.net/9C2u3/

+0

Co, jeśli wartość nie jest obecna! nie będzie jego powrotu 'niezdefiniowane'? Czuję, że to nie najlepszy sposób, aby sobie z tym poradzić? –

4

Korzystanie Underscore można użyć _.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: Możesz użyć ES6 filtr w połączeniu z funkcjami strzałek

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

Można użyć _.where funkcję

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

następnie zaktualizować Dopasuj

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

'_.findWhere' nie byłoby wystarczające w tym senario, ponieważ pasuje do wszystkich par wartości klucza –

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 
    } 
}); 

To powinno wystarczyć. To czysty i niezawodne oraz podkreślenia

+2

Czy nie powinieneś zwracać' obj' w funkcji transformacji? W przeciwnym razie otrzymasz tablicę niezdefiniowanych elementów. – Sebastian

4

Można użyć findWhere i przedłużyć

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

A staright przodu za pomocą find() funkcję lodash, w

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; 

Uwaga: Jeśli istnieje wiele obiektów Moroni, _. find może pobrać tylko pierwszy mecz.

Powiązane problemy