【问题标题】:Push elements into immutable map将元素推送到不可变映射中
【发布时间】:2017-11-25 08:48:27
【问题描述】:

我有一个不可变映射,我正在迭代一个数组,构建我想要推入该不可变映射的对象。这样做的适当方法是什么?这是我所拥有的:

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(people) // 这里没有插入 John 或 Lisa,因为 people 是不可变的。

我知道如何插入一个并将其分配给一个新变量:

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

但是当我有一个循环要通过时,我该怎么做呢?

【问题讨论】:

    标签: javascript immutable.js


    【解决方案1】:

    您需要在循环内重新分配people

    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/immutable@3.8.1/dist/immutable.js"></script>

    【讨论】:

      【解决方案2】:

      另一种方法是首先“准备”新的人物地图,然后将其与现有地图合并。

      喜欢:

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

      这样,您不会放弃不变性,这就是您可能首先使用 Immutable.js 的原因。 ;)

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2019-12-05
        • 1970-01-01
        • 1970-01-01
        • 2021-03-11
        • 1970-01-01
        • 2020-03-01
        • 2022-12-22
        相关资源
        最近更新 更多