[英]filter array of object on multi conditions
我有這個數組
const d = [{
"type": "price",
"value": {
"min": 0,
"max": 170
}
}, {
"type": "name",
"value": {}
}, {
"type": "volume",
"options": [1,2]
}]
如果值沒有值或選項是空數組,我想過濾。 所以我做了
d.filter(o => o.value || o.options)
我希望type:name
消失了,但為什么它仍然存在?
我也試過 lodash
d.filter(o => !isEmpty(o.value) || !isEmpty(o.options))
沒有按預期工作?
{}
和[]
是真實值
console.log(Boolean([])) console.log(Boolean({}))
您可以檢查數組的長度,如果是對象,則可以獲取鍵,值或條目並檢查其長度
const d = [{"type": "price","value": {"min": 0,"max": 170}}, {"type": "name","value": {}}, {"type": "volume","options": [1,2]}] let op = d.filter(o => ( Object.values(o.value || {}) || (o.options || [] )).length) console.log(op)
{}
仍然是真實值,您必須檢查其鍵的長度
const d = [{ "type": "price", "value": { "min": 0, "max": 170 } }, { "type": "name", "value": {} }, { "type": "volume", "options": [1,2] }] console.log(d.filter(o => (o.value && Object.keys(o.value).length) || o.options))
這是我的解決方案。
const d = [{ "type": "price", "value": { "min": 0, "max": 170 } }, { "type": "name", "value": {} }, { "type": "volume", "options": [1,2] }] function notEmpty(n){ return (!!n ? typeof n === 'object' ? Array.isArray(n) ? !!n.length : !!Object.keys(n).length : true : false); } console.log(d.filter(o => notEmpty(o.value) || notEmpty(o.options)));
希望會對您有所幫助。
提供自定義過濾器回調,您可以在其中檢查values
屬性和options
屬性中的任何entry
。
const d = [ { "type": "price", "value": { "min": 0, "max": 170 } }, { "type": "name", "value": {} }, { "type": "volume", "options": [1,2] } ]; function doesHaveValuesAndOptions(obj) { const valueEntries = obj.value ? Object.entries(obj.value) : [], options = obj.options || []; if (!valueEntries.length && !options.length) return false; else if (valueEntries.length || options.length) return true; return false; } const res = d.filter(doesHaveValuesAndOptions); console.log(res);
使用lodash,可以將_.reject()
與_.isEmpty()
以刪除具有空value
對象和空options
數組的項目:
const arr = [{"type": "price","value": {"min": 0,"max": 170}}, {"type": "name","value": {}}, {"type": "volume","options": [1,2]}] const result = _.reject(arr, o => _.isEmpty(o.value) && _.isEmpty(o.options)) console.log(result)
<script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.17.11/lodash.js"></script>
使用lodash / fp,您可以輕松地生成一個函數,該函數提取value
和options
,並通過_.every()
對其進行迭代,如果兩者均為空,則返回true
(應刪除):
const { reject, flow, props, every, isEmpty } = _ const fn = reject(flow(props(['value', 'options']), every(isEmpty))) const arr = [{"type": "price","value": {"min": 0,"max": 170}}, {"type": "name","value": {}}, {"type": "volume","options": [1,2]}] const result = fn(arr) console.log(result)
<script src='https://cdn.jsdelivr.net/g/lodash@4(lodash.min.js+lodash.fp.min.js)'></script>
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.