[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();
上一篇:Codeforces Round #336 (Div. 2)B. Hamming Distance Sum 前缀和


下一篇:洛谷P1141 01迷宫【bfs】