DEV Community

Utils for JavaScript - what do you use regularly?

Dragoljub Bogićević on March 21, 2020

Recently, I started working on my own utils set of JavaScript functions that can be used on every day basis. This is the current list (full docs c...
Collapse
 
vonheikemen profile image
Heiker

map and filter for objects. I've done this a couple of times.

const Obj = {
  map(fn, data) {
    let result = {};
    for (let [key, value] of Object.entries(data)) {
      result[key] = fn(value, key, data);
    }

    return result;
  },
  filter(fn, data) {
    let result = {};
    for (let [key, value] of Object.entries(data)) {
      if(fn(value, key, data)) {
        result[key] = value;
      }
    }

    return result;
  }
};

I've also used a "better" typeof.

function what_is(arg) {
  const is = Object.prototype.toString.call(arg);

  return {
    val: () => is,
    object: () => is == '[object Object]',
    array: () => is == '[object Array]',
    promise: () => is == '[object Promise]',
    undefined: () => is == '[object Undefined]',
    null: () => is == '[object Null]',
    number: () => is == '[object Number]',
    func: () => is == '[object Function]'
  };
}
Collapse
 
bravemaster619 profile image
bravemaster619 • Edited

Safe number for price calculations.

const safeNumber = (num, defaultValue = 0, allowNegative = false) => {
  if (!num) {
    num = 0;
  }
  num = Number(num)
  if (isNaN(num)) {
    if (defaultValue === undefined) {
      console.log(num)
      throw new Error('Given argument is NaN')
    } else {
      return defaultValue
    }
  }
  if (num === Infinity) {
    if (defaultValue === undefined) {
      console.log(num)
      throw new Error('Given argument is infinity')
    } else {
      return defaultValue
    }
  }
  if (!allowNegative && num < 0) {
    if (defaultValue === undefined) {
      console.log(num)
      throw new Error('Given argument is negative')
    } else {
      return defaultValue
    }
  }
  return num
}
Collapse
 
patarapolw profile image
Pacharapol Withayasakpunt • Edited
export async function mapAsync<T, R = T> (
  arr: T[],
  cb: (el: T, i: number, a0: T[]) => Promise<R>,
): Promise<R[]> {
  return Promise.all(arr.map(async (el, i, a0) => {
    return await cb(el, i, a0)
  }))
}

export function distinctBy<T> (arr: T[], k: string, undefinedIsDistinct?: boolean): T[] {
  const arrK = arr.map((a) => hash((a as any)[k]))
  return arr.filter((a, i) => {
    const aK = (a as any)[k]
    if (aK === undefined) {
      return !!undefinedIsDistinct
    } else {
      return arrK.indexOf(hash(aK)) === i
    }
  })
}

export function * chunk<T> (arr: T[], n: number) {
  for (let i = 0; i < arr.length; i += n) {
    yield arr.slice(i, i + n)
  }
}

Are you trying to create next lodash or something?

Collapse
 
brightknight08 profile image
Tim Anthony Manuel • Edited

Hmm... What about..

[array].every(item=>[array2].includes(item))
Collapse
 
bogicevic7 profile image
Dragoljub Bogićević • Edited

Good one! Added to version 1.0.9...