2013-04-22 11 views
19

Ho un array di dati simili:Come posso aggiornare una riga in un array javascript in base a un valore chiave?

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

Se ho un oggetto come questo:

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

C'è un modo semplice che possa aggiornare la variabile nameInfo. Il tasto tra questi è la colonna del nome. So che c'è un modo in cui potrei fare cercando la riga, rimuovendo e aggiungendo ma vorrei che abbia un modo per farlo dove ho aggiornato la riga. Si noti che, se aiuta, ho caricato underscore.js.

+0

Quindi i nomi sono unici? Allora perché non sono il _names_ per le proprietà dell'oggetto in primo luogo? – CBroe

+0

Sì, mi dispiace, avrei dovuto dire. I nomi sono unici. –

+0

Bene, allora avrei creato il tutto nella forma '{" Moroni ": {" age ": 51}}' - così puoi verificare l'esistenza di una voce per nome senza dover ricorrere a tutte le voci. – CBroe

risposta

26

Il modo più semplice è quello di solo ciclo su e trovare quello con un nome corrispondente quindi aggiornare l'età :

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

Utilizzando sottolineatura è possibile utilizzare il metodo _.find per effettuare le seguenti operazioni invece del ciclo for:

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

JSFiddle Example

+0

Nell'esempio di sottolineatura, vedo che hai dichiarato una nuova variabile chiamata "match" in cui hai salvato il risultato di _.find. Ora hai aggiornato quella variabile "match" con i dati aggiornati. Come viene aggiornato l'array originale che è "nameInfo". Sono un po 'nuovo per sottolineare. – Achyut

+5

@Achyut La corrispondenza della variabile è un riferimento all'elemento pertinente nell'array originale, non una copia. Quindi gli aggiornamenti a questo sono anche gli aggiornamenti per l'elemento originale. –

1

È possibile utilizzare il metodo _.find, in questo modo:

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

esempio di lavoro: http://jsfiddle.net/9C2u3/

+0

Cosa succede se il valore non è presente! non tornerà 'indefinito'? Sento che questo non è il modo migliore per affrontare questo? –

4

Usando sottolineatura è possibile utilizzare _.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: È possibile utilizzare il filtro ES6 combinato con le funzioni freccia

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

È possibile utilizzare la funzione _.where

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

quindi aggiornare la partita

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

'_.findWhere' non sarebbe sufficiente in questo senario poiché corrisponde a tutte le coppie di valori chiave –

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

Questo dovrebbe farlo. E 'pulito e affidabile e con sottolineatura

+2

Non è necessario restituire' obj' nella funzione di trasformazione? Altrimenti otterrai una serie di elementi non definiti. – Sebastian

4

È possibile utilizzare findWhere ed estendere

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

Un avanti dritti utilizzando la funzione di lodash 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; 

Nota: Se ci sono più oggetti Moroni, _. find può recuperare solo la prima partita.

Problemi correlati