您的位置:首页 > Web前端 > JavaScript

[Immutable.js] Transforming Immutable Data with Reduce

2016-02-22 03:35 645 查看
Immutable.js iterables offer the reduce() method, a powerful and often misunderstood functional operator on which map(), filter(), groupBy(), etc. are built. The concept is simple: reduce transforms your iterable into something else, that's all. The name is misleading as you may or may not actually "reduce" anything. Let's replicate the groupBy() and filter() methods with reduce to illustrate how it works.

Assume you have a list to todos, each todo with a "completed" prop:

groupBy() like:

const todos = Immutable.List([
{
id: 1,
title: "Immutable.js",
completed: true
},
{
id: 2,
title: "RxJS",
completed: false
},
{
id: 3,
title: "ReactJS",
completed: false
}
]);

const groupedTodos = todos.reduce( (acc, curr)=>{

let key = curr.completed ? "completed" : "Incompleted";

// Initial value is an Immutable Map object, so use get("completed") to get the Immutable.List(), then push the curr value into it
let list = acc.get(key).push(curr);
// Immutable return a new list from last push, so we need to set this list to the initial value
return acc.set(key, list);

}, Immutable.Map({"completed": Immutable.List(), "Incompleted": Immutable.List()}));

console.log(groupedTodos.get("Incompleted").get(1).title); //"ReactJS"


filter() like:

// Get all imcompleted todos
const filteredTodos = todos.reduce( (acc, curr)=>{

if(!curr.completed){
acc = acc.push(curr);
}

return acc;
}, Immutable.List());

console.log(filteredTodos.get(1).title); // "ReactJS"
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: