[Immutable.js] Working with Subsets of an Immutable.js Map()

Immutable.js offers methods to break immutable structures into subsets much like Array--for instance it has the all powerful slice()--and unlike Array it offers functional methods like take() and skip(). You get the best of both the imperative and functional worlds.

 

复制代码
mocha.setup('bdd');
const expect = chai.expect;

class Todo {
  
  constructor(title="", text="", completed=false) {
    this.id = (+new Date() + Math.floor(Math.random() * 999999)).toString(36);
    this.title = title;
    this.text = text;
    this.completed = completed;
  }
  
}

function addTodo(todos, todo) {
  return todos.set(todo.id, todo);
}

function retrieveFinalPair(todos) {
  return todos.slice(todos.size-2, todos.size);
  // Alernatively, you can use this terser syntax
  //return todos.slice(-2);
}

function removeLastEntry(todos) {
  return todos.slice(0, -1);
}

function removeFirstEntry(todos) {
  return todos.slice(1, todos.size);
}

function removeFirstFive(todos) {
  return todos.skip(5);
}

function findMeMonkey(todos) {
  return todos.skipUntil(todo => todo.text === "monkey" );
}

function stopAtMonkey(todos) {
  return todos.skipWhile(todo => todo.text === "monkey" );
}

describe('Working with Subsets of an Immutable.js Map()', () => {
  
  it('should retrieve last two entries using slice()', () => {

    var todos = Immutable.Map();
    
    _.each(_.range(10), (index) => {
      todos = addTodo(todos, new Todo("Todo" + index, "I'm a todo!", false));
    });

    const lastTwoTodos = retrieveFinalPair(todos);
    
    expect(lastTwoTodos.size).to.equal(2);
    
    todos.takeLast(2).forEach(todo => {
      expect(lastTwoTodos.get(todo.id)).to.equal(todo);
    });
    
  });
  
  it('should remove last entry using negative slice()', () => {

    var todos = Immutable.Map();
    
    _.each(_.range(10), (index) => {
      todos = addTodo(todos, new Todo("Todo" + index, "I'm a todo!", false));
    });

    const todosWithoutLast = removeLastEntry(todos);
    
    todos.butLast().forEach(todo => {
      expect(todosWithoutLast.get(todo.id)).to.equal(todo);
    });
    
  });
  
  it('should remove first entry using slice()', () => {

    var todos = Immutable.Map();
    
    _.each(_.range(10), (index) => {
      todos = addTodo(todos, new Todo("Todo" + index, "I'm a todo!", false));
    });

    const todosWithoutFirst = removeFirstEntry(todos);
    
    todos.rest().forEach(todo => {
      expect(todosWithoutFirst.get(todo.id)).to.equal(todo);
    });
    
  });
  
  it('should return last 5 todos using skip()', () => {

    var todos = Immutable.Map();
    
    _.each(_.range(10), (index) => {
      todos = addTodo(todos, new Todo("Todo" + index, "I'm a todo!", false));
    });

    const lastFive = removeFirstFive(todos);
    
    todos.takeLast(5).forEach(todo => {
      expect(lastFive.get(todo.id)).to.equal(todo);
    });
    
  });  
  
  it('should return todos after reaching \"monkey\" using skipUntil()', () => {

    var texts = ["dog", "cat", "frog", "monkey", "octopus", "horse", "orangutan"];
    var todos = Immutable.Map();
    
    _.each(_.range(texts.length), (index) => {
      todos = addTodo(todos, new Todo("Todo" + index, texts[index], false));
    });

    const monkeyAndAfter = findMeMonkey(todos);
    
    todos.takeLast(4).forEach(todo => {
      expect(monkeyAndAfter.get(todo.id)).to.equal(todo);
    });
    
  });  
  
  it('should return todos up to reaching \"monkey\" using skipWhile()', () => {

    var texts = ["dog", "cat", "frog", "monkey", "octopus", "horse", "orangutan"];
    var todos = Immutable.Map();
    
    _.each(_.range(texts.length), (index) => {
      todos = addTodo(todos, new Todo("Todo" + index, texts[index], false));
    });

    const upToMonkey = stopAtMonkey(todos);
    
    todos.take(4).forEach(todo => {
      expect(upToMonkey.get(todo.id)).to.equal(todo);
    });
    
  });
  
});

mocha.run();
复制代码

 

posted @   Zhentiw  阅读(208)  评论(0编辑  收藏  举报
(评论功能已被禁用)
编辑推荐:
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
阅读排行:
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· AI技术革命,工作效率10个最佳AI工具
历史上的今天:
2015-03-01 [Bootstrap] 3. Responsive Gridding (.hidden-sm, visible-md)
点击右上角即可分享
微信分享提示