Got this java solution
public List<List<Integer>> threeSum(int[] num) {
    Arrays.sort(num);
    List<List<Integer>> res = new LinkedList<>(); 
    for (int i = 0; i < num.length-2; i++) {
        if (i == 0 || (i > 0 && num[i] != num[i-1])) {
            int lo = i+1, hi = num.length-1, sum = 0 - num[i];
            while (lo < hi) {
                if (num[lo] + num[hi] == sum) {
                    res.add(Arrays.asList(num[i], num[lo], num[hi]));
                    while (lo < hi && num[lo] == num[lo+1]) lo++;
                    while (lo < hi && num[hi] == num[hi-1]) hi--;
                    lo++; hi--;
                } else if (num[lo] + num[hi] < sum) lo++;
                else hi--;
           }
        }
    }
    return res;
}
My current javascript:
var mysort = function(a, b) {
  return a - b;
}
var threeSum = function(ns) {
  // everything is sorted
  ns.sort(mysort);
  // acc
  let res = [];
  // loop all #, but we keep last 2 elements
  for (let i = 0; i < ns.length - 2; i++) {
    // 1. i === 0, rm 1st element
    // 2. same same skip
    if (i === 0 || (i > 0 && ns[i] !== ns[i - 1])) {
      //if (true) {
      // the 2nd element
      let lo = i + 1;
      // the end element
      let hi = ns.length - 1;
      // remove the 1st element
      let sum = 0 - ns[i];
      // bi search
      while (lo < hi) {
        console.log(lo, hi, ns[lo], ns[hi], sum)
        // bi search: 2nd element + end element === sum
        if ((ns[lo] + ns[hi]) === sum) {
          console.log('push');
          res.push([ns[i], ns[lo], ns[hi]]);
          // skip: lo < hi, lo skip equal
          while (lo < hi && ns[lo] === ns[lo + 1]) lo++;
          // skip: lo < hi, hi skip equal
          while (lo < hi && ns[hi] === ns[hi - 1]) hi--;
          // closer
          lo++;
          // closer
          hi--;
        } else if (ns[lo] + ns[hi] < sum)
          lo++; // lo + hi < sum, lo++
        else
          hi--; // lo + hi > sum, hi--
      }
    }
    return res;
  }
}
console.log(threeSum([-1,0,1,2,-1,-4]));cannot pass the 1st test case:
[-1,0,1,2,-1,-4]
 
     
     
     
    