Use of filter(), map(), reduce() in JavaScript
11/11/2019 • ☕️ 5 min read • JavaScript
.filter()
, .map()
, .reduce()
, আলাদা ভাবে operate করা যায় কিংবা একসাথে চেইন করে ও ব্যবহার করা যায়। এই method গুলা array কে operate করে transform করে একটা নতুন result এ।
Filter
filter()
একটা নতুন array তৈরী করে যে element গুলা callback function এর implemented test pass করে তাদের নিয়ে।
const customers = [
{
name: "Mr. A",
age: 21
},
{
name: "Mr. B",
age: 35
},
{
name: "Mr. C",
age: 18
},
{
name: "Mr. D",
age: 50
},
{
name: "Mr. E",
age: 25
}
];
const result = customers.filter(function(elem){ return elem.age >= 20 && elem.age <= 35;});
console.log(
JSON.stringify(result)
); // [{"name":"Mr. A","age":21},{"name":"Mr. B","age":35},{"name":"Mr. E","age":25}]
এইখানে আমরা customers array কে filter
করেছি। আমরা ওই সব customer return পাবো যাদের age 20 থেকে 35 এর মধ্যে(inclusive)।
আমরা উপরের code টা যদি ES6 এর fat arrow function এ convert করি তাহলে code টা নিচের মতো হবে।
const result = customers.filter((elem) => elem.age >= 20 && elem.age <= 35);
console.log(
JSON.stringify(result)
); // [{"name":"Mr. A","age":21},{"name":"Mr. B","age":35},{"name":"Mr. E","age":25}]
Map
map()
একটা নতুন array তৈরী করে প্রত্যেকটা element এর জন্যে একটা callback function call করে।
const customers = [
{
firstName: "John",
lastName: "Smith"
},
{
firstName: "Joe",
lastName: "Smith"
},
{
firstName: "Bob",
lastName: "Smith"
},
{
firstName: "Mike",
lastName: "Smith"
},
{
firstName: "Juan",
lastName: "Smith"
}
];
const result = customers.map(function(elem) { return { fullName: `${elem.firstName} ${elem.lastName}` }});
console.log(
JSON.stringify(result)
); // [{"fullName":"John Smith"},{"fullName":"Joe Smith"},{"fullName":"Bob Smith"},{"fullName":"Mike Smith"},{"fullName":"Juan Smith"}]
এইখানে customer দের firstName
এবং lastName
আছে আমরা map()
method ব্যবহার করে প্রত্যেক customer এর fullName
তৈরী করতে পারি একটা নতুন এরে তে।
আমরা উপরের code টা যদি ES6 এর fat arrow function এ convert করি তাহলে code টা নিচের মতো হবে।
const result = customers.map((elem) => ({ fullName: `${elem.firstName} ${elem.lastName}` }));
console.log(
JSON.stringify(result)
); // [{"fullName":"John Smith"},{"fullName":"Joe Smith"},{"fullName":"Bob Smith"},{"fullName":"Mike Smith"},{"fullName":"Juan Smith"}]
আমরা map()
করার পর callback function এ যে কোনো type return করতে পারি (Array
, Object
, String
, etc)। একটা code করে দেখি
const customers = [
{
firstName: "John",
lastName: "Smith"
},
{
firstName: "Joe",
lastName: "Smith"
},
{
firstName: "Bob",
lastName: "Smith"
},
{
firstName: "Mike",
lastName: "Smith"
},
{
firstName: "Juan",
lastName: "Smith"
}
];
const result = customers.map(function(elem) {
return elem.firstName.concat(" ", elem.lastName).length;
});
console.log(
JSON.stringify(result)
); // [10,9,9,10,10]
এইখানে আমরা customer এর firstName
, lastName
কে concat করে তার length return করেছি।
Reduce
reduce()
method একটা reducer function run করে প্রত্যেক element এর জন্যে এবং একটা single result return করে। filter
method তার argument এ একটা callback function এবং একটা initial value except করে।
const items = [
{
quantity: 1,
price: 20
},
{
quantity: 5,
price: 200
},
{
quantity: 7,
price: 100
}
];
const total = items.reduce(function(accumulator, currentValue){ return accumulator + (currentValue.quantity * currentValue.price)}, 0);
console.log(total); // 1720
এইখানে আমরা accumulator এ 0
set করেছি। প্রত্যেকটা item এর quantity
এবং price
গুন করে এবং accumulator এর সাথে যোগ করে একটা single result total
পেয়েছি।
আমরা উপরের code টা যদি ES6 এর fat arrow function এ convert করি তাহলে code টা নিচের মতো হবে।
const total = items.reduce( (accumulator, currentValue) => accumulator + (currentValue.quantity * currentValue.price), 0);
console.log(total); // 1720
filter, map, reduce
এখন আমরা filter
, map
, reduce
use করে একটা code করে দেখবো। code করার আগে একটা case বলি
আমাদের কাছে একটা eCommerce business এর orders এর data আছে। আমাদের কে ওই orders থেকে যে সব order এর status ACCEPTED
এবং customer এর age 20
থেকে 30
এর মধ্যে, তাদের কাছে আমরা কতো টাকা sell করতে পেরেছি সেটা বের করতে হবে।
আমরা প্রথমে একটা একটা function use করে result বের করবো তার পর function chain করে result বের করবো।
const orders = [
{
customer: {
id: "A1",
age: 20
},
status: "ACCEPTED",
items: [
{
quantity: 1,
price: 20
}
]
},
{
customer: {
id: "B1",
age: 25
},
status: "ACCEPTED",
items: [
{
quantity: 5,
price: 200
}
]
},
{
customer: {
id: "A1",
age: 20
},
status: "REJECTED",
items: [
{
quantity: 1,
price: 20
},
{
quantity: 5,
price: 200
},
{
quantity: 7,
price: 100
}
]
},
{
customer: {
id: "C1",
age: 35
},
status: "ACCEPTED",
items: [
{
quantity: 1,
price: 10
},
{
quantity: 5,
price: 250
},
{
quantity: 7,
price: 50
}
]
},
{
customer: {
id: "A1",
age: 20
},
status: "ACCEPTED",
items: [
{
quantity: 3,
price: 200
}
]
}
];
তাহলে প্রথমে আমরা ACCEPTED
order এবং যে সব customer দের age 20
থেকে 30
এর মধ্যে তাদের কে বের করি।
const filterOrders = orders.filter(function(elem){ return elem.status === "ACCEPTED" && elem.customer.age >= 20 && elem.customer.age <= 30;});
console.log(filterOrders); // [{"customer":{"id":"A1","age":20},"status":"ACCEPTED","items":[{"quantity":1,"price":20}]},{"customer":{"id":"B1","age":25},"status":"ACCEPTED","items":[{"quantity":5,"price":200}]},{"customer":{"id":"A1","age":20},"status":"ACCEPTED","items":[{"quantity":3,"price":200}]}]
এখন আমরা প্রত্যেক order এর total price calculate করবো।
const mapOrders = mapOrders = filterOrders.map( function(elem) { return elem.items.reduce(function(accumulator, currentValue){ return accumulator + (currentValue.quantity * currentValue.price); }, 0) });
console.log(mapOrders); // [20, 1000, 600]
এখন আমরা সব গুলা value যোগ করলে আমাদের result পেয়ে যাবো।
const totalSell = mapOrders.reduce(function(accumulator, currentValue){ return accumulator + currentValue;}, 0);
console.log(totalSell); // 1620
এখন আমরা এই পুরো কাজটা chain function এবং ES6 এর fat arrow function use করে এই একই কাজটা করে দেখবো।
const totalSell = orders .filter(elem => elem.status === "ACCEPTED" && elem.customer.age >= 20 && elem.customer.age <= 30) .map(elem => elem.items.reduce((accumulator, currentValue) => accumulator + (currentValue.quantity * currentValue.price), 0)) .reduce((accumulator, currentValue) => accumulator + currentValue, 0);
console.log(totalSell); // 1620