Advent Of Code 2017 Day 4 (part 2) in Functional Programming (FP)
I don't see much that I would change about this code. I recently discovered that the spread syntax can be used to split a string into an array so that could be used to eliminate calling the split() function.

Instead of 


const sortWords = words =&gt; words.map(word =&gt;  word.split('').sort().join(''));



use the spread syntax:

const sortWords = words =&gt; words.map(word =&gt;  [...word].sort().join(''));




In this reduction:


const countDuplicate = words =&gt; words.reduce((acc, word) =&gt; {
  return Object.assign(acc, {[word]: (acc[word] || 0) + 1});
}, {});



I presume that the only reason you used brackets with a return statement is because it would be too long for a single line. You could avoid those by pulling out the arrow function to a separate line:

const countWord = (acc, word) =&gt; Object.assign(acc, {[word]: (acc[word] || 0) + 1});
const countDuplicate = words =&gt; words.reduce(countWord, {});


I know that is only one line shorter but at least there is no need for the brackets and return statement.