Какой простой способ реализовать loda sh _.has с родным javascript? - PullRequest
0 голосов
/ 14 апреля 2020

Я понимаю, что мы можем использовать что-то вроде

export function has(object, key) {
  object.hasOwnProperty(key)
}

для реализации очень базовых c поведений _.has. Я также знаю, что автономный пакет из lodash.has выполняет только эту работу.

Но мне кажется, что _.has не должен стоить несколько сотен строк. Какие есть более короткие альтернативы?

Ps, не код гольф-вопрос

1 Ответ

0 голосов
/ 19 апреля 2020

Итак, в основном вы пытаетесь создать альтернативу _.has из lodash, но не хотите писать тысячу строк кода для обработки всех возможных угловых случаев. Вот более легкая версия has, которую я реализовал для вас, которая не упадет, если данные будут несоответствующими (но, очевидно, она не будет обрабатывать столько же случаев, чем в lodash).

Я просто просто взял 2 входа (в качестве аргумента) 1: SOurce, 2: путь (строка / ключи, разделенные точками, или массив строк), затем просто перебрал эти ключи и проверил, существует ли этот ключ или нет, если существует, я обновил текущий source как значение, которое содержит ключ, и следуют тому же процессу.

Вот фрагмент:

function has(src, path = []) {
  let _path = Array.isArray(path) ? path.slice() : (path || '').split('.'),
    o = src,
    idx = 0;

  if (_path.length === 0) {
    return false;
  }

  for (idx = 0; idx < _path.length; idx++) {
    const key = _path[idx];

    if (o != null && o.hasOwnProperty(key)) {
      o = o[key];
    } else {
      return false;
    }
  }
  return true;
}

const obj1 = {a: {b: {c: {d: {e: {f: {g: { h: 210}}}}}}}};

//you can send the path as a array of sequential keys
console.log(has(obj1, ['a', 'b', 'c', 'd', 'e'])) // valid path
console.log(has(obj1, ['a', 'b', 'c', 'd', 'x', 'y'])) //invalid path

//Or, you can pass the path as a single string
console.log(has(obj1, 'a.b.c.d.e.f.g.h')) // valid path
console.log(has(obj1, 'a.x.y.b.c.d.e.f.g.h')) //invalid path
...