Как получить ключ, где свойство объекта имеет значение true? - PullRequest
0 голосов
/ 17 декабря 2018

Я использую lodash и пытаюсь выяснить, как получить имя ключа объекта, для которого действительное свойство установлено в true.

 this.booking = {
    personal:{ valid:false, data:{ } },
    listing:{ valid:true, data:{ } },
    cart:{ valid:false, data:{ } },
    checkout:{ valid:true, data:{ } }
  }

const result = _.map(this.booking, 'valid')
console.log(result) // returns [false, true, false, true]

Как мне написать функцию lodash, которая будет возвращать['listing', 'checkout] на основе объекта выше?

Ответы [ 4 ]

0 голосов
/ 17 декабря 2018

Существует несколько способов сделать это, например, вот несколько вариантов с _.pickBy, _.omitBy и _.transform:

const obj = { personal:{ valid:false, data:{ } }, listing:{ valid:true, data:{ } }, cart:{ valid:false, data:{ } }, checkout:{ valid:true, data:{ } } }

console.log(_.keys(_.pickBy(obj, 'valid'))) 
console.log(_.keys(_.omitBy(obj, {valid: false})))
console.log(_.keys(_.transform(obj,(a, {valid}, k) => valid ? a[k] = valid : null)))
<script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.17.10/lodash.min.js"></script>
0 голосов
/ 17 декабря 2018

Для этого вам не нужен Lodash:

Object.keys(this.booking)
  .filter((key) => this.booking[key].valid);

// returns ['listing', 'checkout']
0 голосов
/ 17 декабря 2018

Или, используя reduce, вы можете сделать это за одну итерацию, поскольку lodash#reduce можно применить непосредственно к объекту.

_.reduce(booking, (r, e, k) => (e.valid && r.push(k), r), [])

Рабочая демонстрация

let bookings = {"personal":{"valid":false,"data":{}},"listing":{"valid":true,"data":{}},"cart":{"valid":false,"data":{}},"checkout":{"valid":true,"data":{}}},
    res = _.reduce(bookings, (r, e, k) => (e.valid && r.push(k), r), []);
    
    console.log(res);
<script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.17.11/lodash.min.js"></script>
0 голосов
/ 17 декабря 2018

Используйте _.pickBy(), чтобы отфильтровать объект, получить действительные свойства, а затем получить ключи с _.keys() (или Object.keys()):

const booking = {
  personal:{ valid:false, data:{ } },
  listing:{ valid:true, data:{ } },
  cart:{ valid:false, data:{ } },
  checkout:{ valid:true, data:{ } }
}

const result = _.keys(_.pickBy(booking, 'valid'));

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