2017-06-22 2 views
0

J'ai une carte immuable, et je suis itérer sur un tableau, construire des objets que je veux pousser dans cette carte immuable. Quelle est la manière appropriée de le faire? Voici ce que j'ai:Pousser des éléments dans une carte immuable

let arrayOfNames = ['John', 'Lisa']; 

arrayOfNames.forEach(function(name) { 
    let id = generateId(); 
    let newPerson = { 
    id: id, 
    name: name, 
    }; 

    // people is the immutable map 
    people.set(id, newPerson); 
}); 

console.log (personnes) // Cela n'a pas John ou Lisa inséré, parce que bien, les gens est immuable.

Je sais comment je peux insérer un et l'affecter à une nouvelle variable:

let newPeople = people.set('3', {id: 3, name: 'John'});

Mais comment pourrais-je faire quand j'ai une boucle pour passer?

Répondre

0

Vous devez réaffecter people à l'intérieur de la boucle.

let people = ... // notice let not const 

arrayOfNames.forEach(function(name) { 
    let id = generateId(); 
    let newPerson = { 
    id: id, 
    name: name, 
    }; 

    // people is the immutable map 
    people = people.set(id, newPerson); 
}); 

let people = new Immutable.Map(); 
 

 
['Alice', 'Jane'].forEach((name, id) => { 
 
    people = people.set(id, {id, name}) 
 
}) 
 

 
console.log(people) 
 

 
// or using reduce 
 

 
const people2 = ['John', 'Peter'].reduce((map, name, id) => map.set(id, {id, name}), new Immutable.Map) 
 

 
console.log(people2)
<script src="https://unpkg.com/[email protected]/dist/immutable.js"></script>

0

Une autre approche serait d'abord « préparer » les nouvelles personnes carte, puis fusionner avec la carte existante.

Comme:

const newPeopleMap = Immutable.Map(['John', 'Lisa'].map(function(personName) { 
    let id = generateId(); 
    let newPerson = { 
     id: id, 
     name: name, 
    }; 

    return [id, newPerson]; 
})); 

const newMergedPeopleMap = people.merge(newPeopleMap); 

De cette façon, vous ne renonçons pas immuabilité, ce qui est la raison pour laquelle vous utilisez probablement Immutable.js en premier lieu. ;)