diff --git a/currying/infiniteCurrying.js b/currying/infiniteCurrying.js index 8ebdf99..847609a 100644 --- a/currying/infiniteCurrying.js +++ b/currying/infiniteCurrying.js @@ -23,10 +23,10 @@ // }; function infiniteCurryingWithVariableArg(func) { - function recursiveCurry(...args){ + function recursiveCurry(...args) { return function(...a) { - if(!a.length){ - return args.reduce((result, value)=>{ + if (!a.length) { + return args.reduce((result, value) => { return func.call(func, result, value); }); } @@ -37,10 +37,10 @@ function infiniteCurryingWithVariableArg(func) { }; function infiniteCurrying(func) { - function recursiveCurry(...args){ + function recursiveCurry(...args) { return function(a) { - if(!a){ - return args.reduce((result, value)=>{ + if (!a) { + return args.reduce((result, value) => { return func.call(func, result, value); }); } @@ -50,6 +50,7 @@ function infiniteCurrying(func) { return recursiveCurry(); }; +// Arrow Functions const fn = infiniteCurrying((a, b) => a + b); const fn2 = infiniteCurryingWithVariableArg((a, b) => a + b); console.log(fn(7)(8)(9)()); diff --git a/js-coding-questions/groupBy.js b/js-coding-questions/groupBy.js new file mode 100644 index 0000000..67ba2f5 --- /dev/null +++ b/js-coding-questions/groupBy.js @@ -0,0 +1,44 @@ +// Suppose you have input like: + +var skillsArray = [ + { skill: 'css', user: 'Bill' }, + { skill: 'javascript', user: 'Chad' }, + { skill: 'javascript', user: 'Bill' }, + { skill: 'css', user: 'Sue' }, + { skill: 'javascript', user: 'Sue' }, + { skill: 'html', user: 'Sue' } +]; + +// Convert it into result of the following form: +// [ +// { skill: 'javascript', user: [ 'Chad', 'Bill', 'Sue' ], count: 3 }, +// { skill: 'css', user: [ 'Sue', 'Bill' ], count: 2 }, +// { skill: 'html', user: [ 'Sue' ], count: 1 } +// ] + +function groupBySkill(array) { + return Object.values(array.reduce((result, { skill, user }) => { + if (!result[skill]) { + return { ...result, [skill]: { skill, user: [user], count: 1 } }; + } + const obj = result[skill]; + return { ...result, [skill]: { skill, user: obj.user.concat(user), count: obj.count + 1 } } + }, {})).sort((a, b) => a.count < b.count ? 1 : -1); +} + +console.log(groupBySkill(skillsArray)); + + +// function groupBySkill(array) { +// return array.reduce((result, { skill, user }) => { + +// const skillExists = result.filter((res) => res.skill === skill).length; + +// if (!result.length || !skillExists) { +// return result.concat({ skill, user: [user], count: 1 }) +// } +// return result.map((res) => { +// return skill === res.skill ? { ...res, user: res.user.concat(user), count: res.count + 1 } : res; +// }) +// }, []).sort((a, b) => a.count < b.count ? 1 : -1) +// }