Как использовать метод Лодаша ._get для проверки 2 значений пути - PullRequest
0 голосов
/ 08 мая 2018

Я использую ._get lib , чтобы проверить наличие двух значений в объекте, а затем вернуть значение по умолчанию ТОЛЬКО ЕСЛИ ОБА, эти 2 пусты.

Например, у меня есть объект;

const obj = { person: { firsName: 'John', lastName: '' }

_get(obj, 'person.firsName', 'noname')} ${_get(state, 
'person.lastName', 'noname')}

Проблема здесь в том, что я получу только «noname noname», даже если у человека по крайней мере одно имя пусто.

Как я могу сделать что-то подобное, особенно если учесть, что я использую это внутри строкового литерала:

`${_get(obj, '!person.firsName && !person.lasName', 'noname')} } `// pseudo

спасибо

1 Ответ

0 голосов
/ 08 мая 2018

Используйте _.get() без defaultValue, чтобы получить оба имени, а затем проверьте, существует ли какое-либо из них перед возвратом «noname»:

const getName = (obj) => {
  const firstName = _.get(obj, 'person.firsName', '')
  const lastName = _.get(obj, 'person.lastName', '')

  return firstName || lastName ? `${firstName} ${lastName}`.trim() : 'noName';
}

const obj = { person: { firsName: 'John' } }
console.log(getName(obj)) // John
console.log(getName({})) // noname
<script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.17.10/lodash.min.js"></script>

Это универсальный метод, который получает несколько путей, фильтрует значения undefined и, если результирующий массив пуст, возвращает массив defaultValue:

const getMultiple = (obj, paths, defaultValue) => {
  const values = paths
    .map((path) => _.get(obj, path))
    .filter((v) => !_.isUndefined(v));

  return values.length ? values : [defaultValue];
}

console.log(
  getMultiple({ person: { firsName: 'John', lastName: 'Smith' }}, ['person.firsName', 'person.lastName'], 'noname').join(' ')
) // John Smith
console.log(
  getMultiple({ person: { firsName: 'John' }}, ['person.firsName', 'person.lastName'], 'noname').join(' ')
) // John
console.log(
  getMultiple({}, ['person.firsName', 'person.lastName'], 'noname').join(' ')
) // noname
<script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.17.10/lodash.min.js"></script>
...