簡體   English   中英

在多條件下過濾對象數組

[英]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,您可以輕松地生成一個函數,該函數提取valueoptions ,並通過_.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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM