如何获得对象的属性为true的键?

时间:2018-12-17 15:06:41

标签: javascript lodash

我正在使用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 :(得分:1)

使用_.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>

答案 1 :(得分:1)

您不需要Lodash:

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

// returns ['listing', 'checkout']

答案 2 :(得分:0)

或者,由于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>

答案 3 :(得分:0)

执行此操作的方法不胜枚举,例如,_.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>