জেনেরিক পদ্ধতিগুলির অর্থ প্রতিবার যখন আমাদের একটি নির্দিষ্ট আচরণ ব্যবহার করার প্রয়োজন হয় তখন আমাদের জটিলতা আবার লিখতে হবে না।
concatMap(বা flatMap) এই পরিস্থিতিতে আমাদের যা প্রয়োজন তা হ'ল।
// concat :: ([a],[a]) -> [a]
const concat = (xs,ys) =>
xs.concat (ys)
// concatMap :: (a -> [b]) -> [a] -> [b]
const concatMap = f => xs =>
xs.map(f).reduce(concat, [])
// id :: a -> a
const id = x =>
x
// flatten :: [[a]] -> [a]
const flatten =
concatMap (id)
// your sample data
const data =
[["$6"], ["$12"], ["$25"], ["$25"], ["$18"], ["$22"], ["$10"]]
console.log (flatten (data))
দূরদর্শিতা
এবং হ্যাঁ, আপনি এটি সঠিকভাবে অনুমান করেছিলেন, এটি কেবলমাত্র একটি স্তরকে সমতল করে তোলে, এটি ঠিক কীভাবে কাজ করা উচিত
এরকম কিছু ডেটা সেট কল্পনা করুন
// Player :: (String, Number) -> Player
const Player = (name,number) =>
[ name, number ]
// team :: ( . Player) -> Team
const Team = (...players) =>
players
// Game :: (Team, Team) -> Game
const Game = (teamA, teamB) =>
[ teamA, teamB ]
// sample data
const teamA =
Team (Player ('bob', 5), Player ('alice', 6))
const teamB =
Team (Player ('ricky', 4), Player ('julian', 2))
const game =
Game (teamA, teamB)
console.log (game)
// [ [ [ 'bob', 5 ], [ 'alice', 6 ] ],
// [ [ 'ricky', 4 ], [ 'julian', 2 ] ] ]
ঠিক আছে, এখন বলুন আমরা এমন একটি রোস্টার মুদ্রণ করতে চাই যাতে এতে অংশ নেওয়া সমস্ত খেলোয়াড় দেখায় game...
const gamePlayers = game =>
flatten (game)
gamePlayers (game)
// => [ [ 'bob', 5 ], [ 'alice', 6 ], [ 'ricky', 4 ], [ 'julian', 2 ] ]
যদি আমাদের flattenপদ্ধতিটি নেস্টেড অ্যারেগুলিকেও সমতল করে তোলে, তবে আমরা এই আবর্জনার ফলাফলটি শেষ করব ...
const gamePlayers = game =>
badGenericFlatten(game)
gamePlayers (game)
// => [ 'bob', 5, 'alice', 6, 'ricky', 4, 'julian', 2 ]
রোলিন গভীর, বাবু
এটি কখনও কখনও আপনি নেস্টেড অ্যারেগুলিও সমতল করতে চান না তা বলার অপেক্ষা রাখে না - কেবল এটিই ডিফল্ট আচরণ নয় should
আমরা সহজেই একটি deepFlattenপদ্ধতি তৈরি করতে পারি …
// concat :: ([a],[a]) -> [a]
const concat = (xs,ys) =>
xs.concat (ys)
// concatMap :: (a -> [b]) -> [a] -> [b]
const concatMap = f => xs =>
xs.map(f).reduce(concat, [])
// id :: a -> a
const id = x =>
x
// flatten :: [[a]] -> [a]
const flatten =
concatMap (id)
// deepFlatten :: [[a]] -> [a]
const deepFlatten =
concatMap (x =>
Array.isArray (x) ? deepFlatten (x) : x)
// your sample data
const data =
[0, [1, [2, [3, [4, 5], 6]]], [7, [8]], 9]
console.log (flatten (data))
// [ 0, 1, [ 2, [ 3, [ 4, 5 ], 6 ] ], 7, [ 8 ], 9 ]
console.log (deepFlatten (data))
// [ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 ]
সেখানে। এখন প্রতিটি কাজের জন্য আপনার কাছে একটি সরঞ্জাম রয়েছে - একটি স্তরের বাসা বাঁধার জন্য একটি flattenএবং সমস্ত বাসা বেঁধে দেওয়ার জন্য একটিdeepFlatten ।
হতে পারে আপনি এটি কল করতে পারেন obliterateবা nukeআপনি নামের মত না deepFlatten।
দু'বার পুনরাবৃত্তি করবেন না!
অবশ্যই উপরের প্রয়োগগুলি চতুর এবং সংক্ষিপ্ত, তবে .mapএকটি কল অনুসরণ করে ব্যবহার করে.reduce আমরা এটি প্রয়োজনের চেয়ে আরও বেশি পুনরাবৃত্তি করছি
আমি যে বিশ্বস্ত সমন্বয়কারীকে ফোন করছি তা ব্যবহার mapReduceকরে পুনরাবৃত্তিগুলি একটি মিনিমে রাখতে সহায়তা করে; এটি একটি ম্যাপিং ফাংশন নেয় m :: a -> b, একটি হ্রাসকরণ ফাংশন r :: (b,a) ->bএবং একটি নতুন হ্রাসকরণ ফাংশন ফিরিয়ে দেয় - এই সংযোজকটি ট্রান্সডুসারদের কেন্দ্রে রয়েছে ; আপনি যদি আগ্রহী হন তবে আমি সেগুলি সম্পর্কে অন্যান্য উত্তর লিখেছি
// mapReduce = (a -> b, (b,a) -> b, (b,a) -> b)
const mapReduce = (m,r) =>
(acc,x) => r (acc, m (x))
// concatMap :: (a -> [b]) -> [a] -> [b]
const concatMap = f => xs =>
xs.reduce (mapReduce (f, concat), [])
// concat :: ([a],[a]) -> [a]
const concat = (xs,ys) =>
xs.concat (ys)
// id :: a -> a
const id = x =>
x
// flatten :: [[a]] -> [a]
const flatten =
concatMap (id)
// deepFlatten :: [[a]] -> [a]
const deepFlatten =
concatMap (x =>
Array.isArray (x) ? deepFlatten (x) : x)
// your sample data
const data =
[ [ [ 1, 2 ],
[ 3, 4 ] ],
[ [ 5, 6 ],
[ 7, 8 ] ] ]
console.log (flatten (data))
// [ [ 1. 2 ], [ 3, 4 ], [ 5, 6 ], [ 7, 8 ] ]
console.log (deepFlatten (data))
// [ 1, 2, 3, 4, 5, 6, 7, 8 ]