Given a pivot x, and a list lst, partition the list into three parts
In your first solution you are traversing the list 3 times, whereas in the second solution only once. Given the functional-tag, I’d say you’re after the reduce function:

const flatten = (acc, x) =&gt; acc.concat(x)

const pivotPartition = (pivot, ary) =&gt; {
  const toOrdered = (triplet, n) =&gt; {
    let [less, equal, greater] = triplet

    switch(true) {
      case n &lt; pivot: less.push(n); break
      case n &gt; pivot: greater.push(n); break
      default: equal.push(n)
    }

    return triplet
  }

  return ary.reduce(toOrdered, [[], [], []]).reduce(flatten)
}


If you want to sort the subarrays as well, then the whole thing is just a ary.sort((a, b) =&gt; a - b), although as it is mutating the list, it isn’t a functional solution.