фильтрация не пустого или неопределенного значения объекта - PullRequest
0 голосов
/ 08 мая 2019

Попытка отфильтровать неопределенные значения объекта.

const activeCard = _.pickBy(cards);

Консольный вывод ActiveCard показывает объект ниже.

 { cardValue1: 
   [ { account_value: '4422444443333004',
       country: 'US',
       month: '01',
       year: '2029',
       confirmation: [Object] } ],
  cardValue2: [ { account_value: undefined } ],
  cardValue3: [ { account_value: undefined } ] }

Я пробовал что-то вроде этого, что не сработало

const newObject = _.omitBy(activeCard, _.isNil);

// also tried to filter out at the level of _.pickBy which didnt work

const activeCard = _.pickBy(cards, (value) => { return value.length > 0; });

// output i am looking for is something like below
[ { account_value: '4422444443333004',
       country: 'US',
       month: '01',
       year: '2029',
       confirmation: [Object] } ]
// So basically, Im looking for output with 'undefined' object values filtered out.

Ответы [ 3 ]

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

Используйте _.filter() и проверьте с помощью Array.some() (или lodash _.some()), содержит ли массив свойства account_value, который не равен nil.Затем сведите результаты в один массив.

const activeCard = {"cardValue1":[{"account_value":"4422444443333004","country":"US","month":"01","year":"2029","confirmation":[null]}],"cardValue2":[{}],"cardValue3":[{}]}

const result = _.flatten(_.filter(activeCard, arr => 
  arr.some(o => !_.isNil(o.account_value))
))

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

С помощью lodash / fp вы можете создать функцию, которая фильтрует, повторяя с _.some(), получая account_value и проверяя, не является ли nil,Затем сводит результаты в один массив.

const { filter, some, flow, get, negate, isNil, flatten } = _

const fn = flow(
  filter(some(flow(
    get('account_value'),
    negate(isNil)
  ))),
  flatten
)

const activeCard = {"cardValue1":[{"account_value":"4422444443333004","country":"US","month":"01","year":"2029","confirmation":[null]}],"cardValue2":[{}],"cardValue3":[{}]}

const result = fn(activeCard)

console.log(result)
<script src='https://cdn.jsdelivr.net/g/lodash@4(lodash.min.js+lodash.fp.min.js)'></script>
0 голосов
/ 08 мая 2019

Lodash делает это очень легко.

const cards = {
 cardValue1: 
   [ { account_value: '4422444443333004',
       country: 'US',
       month: '01',
       year: '2029',
       confirmation: [Object] } ],
  cardValue2: [ { account_value: undefined } ],
  cardValue3: [ { account_value: undefined } ] 
 }

const activeCards = _(cards)
      .pickBy(v => v.length)
      .values()
      .flatten()
      .filter('account_value')
      
console.log(activeCards);
<script src="https://cdn.jsdelivr.net/npm/lodash@4.17.11/lodash.min.js"></script>
0 голосов
/ 08 мая 2019

использовать обычную функцию может быть?

function sanitize(a) {
  let b = JSON.parse(JSON.stringify(a))
  for (const key in b) {
    if (Array.isArray(b[key])) {
      if (_.isEmpty(b[key][0])) delete b[key]
    }
  }
  return b;
}
const filteredActiveCard = sanitize(activeCard)
...