Может ли lodash удалить массивы, содержащие только null или undefined? - PullRequest
0 голосов
/ 14 января 2019

У меня есть объект данных, который выглядит следующим образом:

var obj = {
    "one":      null,
    "two":      undefined,
    "three":    [undefined],
    "four":     "valid value"
}

И мне нужно закончить с этим:

{
    "four":     "valid value"
}

Я использую lodash, чтобы попытаться выполнить это, и это частично помогло мне:

obj = _.pick(obj, _identity);

Что дает мне:

{
    "three":    [undefined],
    "four":     "valid value"
}

Существует ли ориентированный на lodash способ удаления не только ключей, значения которых являются нулевыми или неопределенными, а также удаления ключей, значениями которых являются массивы, содержащие только неопределенные или нулевые значения? Я знаю, что есть куча способов сделать это в общем, мне просто интересно, есть ли у lodash какой-нибудь способ сделать это запеканкой.

Ответы [ 2 ]

0 голосов
/ 14 января 2019

использовать без

Создает массив, исключающий все заданные значения, используя SameValueZero для равенства равенств.

https://lodash.com/docs/#without

obj = _.without(obj, undefined,null,[undefined])
0 голосов
/ 14 января 2019

Вам необходимо использовать _.omitBy() с _.empty() для объектов (включая массивы) и !value для примитивов. Вы также должны _.compact() массивы перед проверкой, если они пустые, чтобы игнорировать falsy значения:

var obj = {
    "one":      null,
    "two":      undefined,
    "three":    [undefined],
    "four":     "valid value",
}

var fn = o => _.omitBy(o, v => _.isObject(v) ? 
  _.isEmpty(_.isArray(v) ? _.compact(v) : v)
  : 
  !v
)

var result = fn(obj)

console.log(result)
<script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.17.11/lodash.min.js"></script>

Если вы хотите удалить значения falsy и пустые массивы / объекты во вложенном объекте / массиве, используйте _.transform() рекурсивно. Используйте _.compact() для удаления falsy значений из массивов, а _.isEmpty() и Boolean для проверки:

Если вам нужно рекурсивное решение, вы можете использовать _.transform():

var obj = {
    "one":      null,
    "two":      undefined,
    "three":    [undefined],
    "four":     "valid value",
    "five":     [undefined, 1],
    "six":      [{ a: null, b: [] }, undefined]
}

var cleanArray = (o) => _.isArray(o) ? _.compact(o) : o;

var clean = o => _.transform(o, (r, v, k) => {
  var isObject = _.isObject(v)
  var val = isObject ? cleanArray(clean(v)) : v
  var keep = isObject ? !_.isEmpty(val) : Boolean(val)
  
  if(keep) r[k] = val
})

var result = clean(obj)

console.log(result)
<script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.17.11/lodash.min.js"></script>
...