2015-03-18 12 views

risposta

39

In sostanza, no: si sta eseguendo un elenco di ricerca per valore, non per indice, quindi sarà sempre un attraversamento lineare.

Un miglioramento sarebbe quella di utilizzare find invece di filter:

var result = map.find(function(obj){return obj.get('id') === 4;}); 
+0

Ah, carino, ho provato questo, ma non ci sono riuscito più. Ma questo più preciso \t. Grazie! – sspross

+0

Questo funziona anche per Elenco. Grazie. – Lebul

-2

C'è già un modo questo è più facile? Non lo so. ma puoi scrivere la tua funzione. Qualcosa del genere dovrebbe funzionare:

var myFunc = function(id){ 

    var object = map.filter(function(obj){return obj.get('id') === id}).first(); 

    return object; 
} 

Poi si dovrebbe solo fare:
var myObj = myFunc(4);

+1

sì ok che è vero, ma non è questo il punto. forse hai ragione e non c'è un modo "più semplice". Speravo di aver perso un punto nella documentazione Immutable :) – sspross

+0

@sspross, non ero sicuro se questo sarebbe stato quello che volevi. Era la mia ipotesi migliore, dato che in realtà non ho usato Immutable (speravo che volessi una soluzione JS generale). – Jakar

10

La prima cosa da notare è che non si è in realtà la creazione di una mappa, si sta creando un elenco:

var result = [{'id': 2}, {'id': 4}]; 
var map = Immutable.fromJS(result); 

Immutable.Map.isMap(map); // false 
Immutable.List.isList(map); // true 

Per creare una mappa è possibile utilizzare un argomento reviver nella propria chiamata (docs), ma non è certamente l'API più intuitiva, in alternativa è possibile effettuare una delle seguenti operazioni:

// lets use letters rather than numbers as numbers get coerced to strings anyway 
var result = [{'id': 'a'}, {'id': 'b'}]; 
var map = Immutable.Map(result.reduce(function(previous, current) { 
    previous[ current.id ] = current; 
    return previous; 
}, {})); 

Immutable.Map.isMap(map); // true 

Ora abbiamo una mappa corretta Immutable.js che ha un metodo get

var item = Map.get('a'); // {id: 'a'} 
4

Può essere importante per garantire l'ordine della matrice. Se questo è il caso:

  1. Utilizzare un OrderedMap
  2. fare un metodo set sulla OrderedMap ad ogni iterazione della matrice di origine

L'esempio che segue utilizza "withMutations" per migliorare le prestazioni.

var OrderedMap = Immutable.OrderedMap 


// Get new OrderedMap 
function getOm(arr) { 
    return OrderedMap().withMutations(map => { 
     arr.forEach(item => map.set(item.id, item)) 
    }) 
} 

// Source collection 
var srcArray = [ 
    { 
     id: 123, 
     value: 'foo' 
    }, 
    { 
     id: 456, 
     value: 'bar' 
    } 
] 


var myOrderedMap = getOm(srcArray) 

myOrderedMap.get(123) 
// --> { id: 123, value: 'foo' } 

myOrderedMap.toObject() 
// --> { 123: {id: 123, value: 'foo'}, 456: {id: 456, value: 'bar'} } 

myOrderedMap.toArray() 
// --> [ {id: 123, value: 'foo'}, { id: 456, value: 'bar' } ] 
3

Quando si utilizza fromJS per array, si ottiene Elenco non mappa. Sarà migliore e più facile se crei una mappa. Il seguente codice convertirà il risultato in mappa Immutable.

const map = result.reduce((map, json) => 
    map.set(json.id, Immutable.fromJS(json)) 
    , Map()); 

Ora, è possibile

map.get('2'); //{'id': 2} 

nota, se il risultato è annidato struttura e se questo abbia matrice, sarà un elenco con il codice qui sopra.

2

Con sintassi ES2015 (e costanti):

const result = map.find(o => o.get('id') === 4); 
Problemi correlati