我正在使用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]
?
答案 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>