2015-08-24 11 views
6

Spero di sfruttare il carattere di sottolineatura per evitare di scrivere i loop for nella mia base di codice. Sto usando map al posto di un ciclo for in questo modo:Utilizzare il carattere di sottolineatura per modificare una proprietà di oggetti in una matrice

body.tags = _.map(body.tags, function(tag) { 
    return { 
    id: tag.id, 
    userId: tag.userId, 
    createDate: tag.createDate, 
    tag: tag.tag.toLowerCase(), 
    }; 
}); 

La mia domanda è: esiste un modo per farlo senza specificare le proprietà che non cambieranno (tutto tranne tag)? Sembra eccessivo usare campi come id: tag.id.

+0

body.tags è un array? – Amit

+0

@Amit, yes 'body.tags' è una matrice di oggetti, ciascuno con la struttura mostrata all'interno del blocco' return'. – MattDionis

+0

Se si vuole continuare ad usare l'approccio '_.map', si potrebbe dire' return _.extend (tag, {tag: tag.tag.toLowerCase()}); '. Tuttavia, la risposta usando 'forEach' è migliore. –

risposta

7

Non c'è nemmeno bisogno di sottolineatura per questo:

body.tags.forEach(function(t) { t.tag = t.tag.toLowerCase();}); 

map (sia nativo, sottolineatura o altri) viene utilizzato per trasformare i valori interi, non è un tipico caso d'uso di fare ciò che si è tentato di fare con esso. Inoltre, l'utilizzo di un semplice for potrebbe avere prestazioni migliori poiché non sono necessarie chiamate di funzione qui, ma ciò dipende dalle ottimizzazioni del runtime.

A proposito, se si sostituisce la funzione di mappatura con la funzione da questa risposta e non impostare il valore di ritorno di nuovo a body.tags, potrai anche ottenere il risultato desiderato.

+0

questa è la risposta giusta, puoi usare underscore/lodash per trovare gli oggetti che vuoi manipolare. per sarebbe più veloce, ma se non si dispone di milioni di elementi è ok per farlo nel modo più semplice;) – webdeb

5

È possibile provare il seguente codice per modificare una singola proprietà in una raccolta utilizzando il carattere di sottolineatura.

_.map(body.tags, function(tag) { 
    tag.tag = tag.tag.toLowerCase(); 
    return tag; 
}); 

C'è un beneficio nel usando il metodo mappa di lodash (simile a sottolineare libreria) su forEach nativo e le sue prestazioni. In base al post why lodash is faster than native forEach, forse è giustificato utilizzare lodash a favore sia di underscore sia di native forEach to loop. Tuttavia, sarei d'accordo con l'utente che ha commentato di seguito "Scegli l'approccio più scrivibile, leggibile e manutenibile".

+1

Perché l'OP dovrebbe "provare questo"? Una buona risposta avrà sempre una spiegazione di cosa è stato fatto e perché è stato fatto in quel modo, non solo per l'OP ma per i futuri visitatori di SO. –

+1

Grazie per il feedback Jay Blanchard. Sono d'accordo con quello che hai detto. Stavo solo rispondendo alla domanda posta da OP. Chiaramente non stavo pensando dalla prospettiva dei futuri visitatori. Terrò questo in mente e così via. – invalidred

+2

Questo non funzionerà, perché la funzione passata alla mappa non restituisce nulla. A proposito, le prestazioni sono l'ultima ragione per scegliere un'alternativa piuttosto che un'altra. Scegli l'approccio che è più scrivibile, leggibile e manutenibile. –

Problemi correlati