tiny-querystring icon indicating copy to clipboard operation
tiny-querystring copied to clipboard

parse smaller

Open milahu opened this issue 3 years ago • 0 comments

feel free to steal my code ; )

var parse = (hashString) => (
  Object.fromEntries(
    hashString.slice(1).split('&')
    .map(keyval => (
      cut = keyval.indexOf('='),
      (cut == -1) ? [keyval, true] : (
        key = keyval.slice(0, cut),
        val = decodeURIComponent(keyval.slice(cut + 1)),
        [key, val]
      )
    ))
    .filter(([key, val]) => Boolean(key))
  )
)

sample

> parse('#&&=ignoreMe&foo=bar&foo2=bar=baz=boo&keyOnly')
{ foo: 'bar', foo2: 'bar=baz=boo', keyOnly: true }
a bit more complex (parse numbers and number arrays)

var parseGet = (typekeys) => {
  typekeys = Object.fromEntries(['number', 'numberArray'].map(type => (
    keys = typekeys[type],
    [type, (Array.isArray(keys) ? new Set(keys) : keys.has ? keys : new Set())]
  )));
  if (Array.isArray(keys.number)) keys.number = new Set(numKeys);
  if (!keys.number || !keys.number.has) keys.number = new Set();
  var parse = (hashString) => (
    Object.fromEntries(
      hashString.slice(1).split('&')
      .map(keyval => (
        cut = keyval.indexOf('='),
        (cut == -1) ? [keyval, true] : (
          key = keyval.slice(0, cut),
          raw = keyval.slice(cut + 1),
          val = (
            typekeys.number.has(key) ? parseFloat(raw) :
            typekeys.numberArray.has(key) ? raw.split(',').map(parseFloat) :
            decodeURIComponent(raw)
          ),
          [key, val]
        )
      ))
      .filter(([key, val]) => Boolean(key))
    )
  );
  return parse;
}

var parse = parseGet(); // default parser

var parse = parseGet({ number: ['num1', 'num2'], numberArray: ['numarr1', 'numarr2'] });

parse('#&&=ignoreMe&foo=bar&foo2=bar=baz=boo&keyOnly&num1=1234.5678&numarr1=1.0,2,3,4.567')
var res = {
  foo: 'bar',
  foo2: 'bar=baz=boo',
  keyOnly: true,
  num1: 1234.5678,
  numarr1: [ 1, 2, 3, 4.567 ]
}

milahu avatar Mar 03 '21 09:03 milahu