SOURCE

let arr = [
    {
        "水电": 226,
        "直接人工": 604,
        "折旧费": 11,
        "维度": "2021\n贵阳联塑\n配件车间\n"
    },
    {
        "水电": 5,
        "直接人工": 733,
        "折旧费": 115,
        "维度": "2021\n贵阳联塑\n管材车间\n"
    },
    {
        "水电": 501,
        "直接人工": 378,
        "折旧费": 71,
        "维度": "2021\n武汉联塑\n配件车间\n"
    },
    {
        "水电": 345,
        "直接人工": 864,
        "折旧费": 92,
        "维度": "2021\n武汉联塑\n管材车间\n"
    },
    {
        "水电": 169,
        "直接人工": 958,
        "折旧费": 59,
        "维度": "2021\n广东科技\n配件车间\n"
    },
    {
        "水电": 775,
        "直接人工": 404,
        "折旧费": 73,
        "维度": "2021\n广东科技\n管材车间\n"
    },
    {
        "水电": 62,
        "直接人工": 210,
        "折旧费": 125,
        "维度": "2020\n贵阳联塑\n配件车间\n"
    },
    {
        "水电": 127,
        "直接人工": 831,
        "折旧费": 57,
        "维度": "2020\n贵阳联塑\n管材车间\n"
    },
    {
        "水电": 480,
        "直接人工": 22,
        "折旧费": 8,
        "维度": "2020\n武汉联塑\n配件车间\n"
    },
    {
        "水电": 754,
        "直接人工": 411,
        "折旧费": 67,
        "维度": "2020\n武汉联塑\n管材车间\n"
    },
    {
        "水电": 238,
        "直接人工": 927,
        "折旧费": 193,
        "维度": "2020\n广东科技\n配件车间\n"
    },
    {
        "水电": 509,
        "直接人工": 571,
        "折旧费": 200,
        "维度": "2020\n广东科技\n管材车间\n"
    },
    {
        "水电": 230,
        "直接人工": 617,
        "折旧费": 32,
        "维度": "2022\n贵阳联塑\n配件车间\n"
    },
    {
        "水电": 795,
        "直接人工": 639,
        "折旧费": 152,
        "维度": "2022\n贵阳联塑\n管材车间\n"
    },
    {
        "水电": 371,
        "直接人工": 373,
        "折旧费": 104,
        "维度": "2022\n武汉联塑\n配件车间\n"
    },
    {
        "水电": 509,
        "直接人工": 324,
        "折旧费": 2,
        "维度": "2022\n武汉联塑\n管材车间\n"
    },
    {
        "水电": 331,
        "直接人工": 938,
        "折旧费": 46,
        "维度": "2022\n广东科技\n配件车间\n"
    },
    {
        "水电": 20,
        "直接人工": 218,
        "折旧费": 157,
        "维度": "2022\n广东科技\n管材车间\n"
    },
    {
        "水电": 2,
        "直接人工": 48,
        "折旧费": 110,
        "维度": "2024\n贵阳联塑\n配件车间\n"
    },
    {
        "水电": 310,
        "直接人工": 372,
        "折旧费": 4,
        "维度": "2024\n贵阳联塑\n管材车间\n"
    },
    {
        "水电": 592,
        "直接人工": 894,
        "折旧费": 84,
        "维度": "2024\n武汉联塑\n配件车间\n"
    },
    {
        "水电": 710,
        "直接人工": 358,
        "折旧费": 90,
        "维度": "2024\n武汉联塑\n管材车间\n"
    },
    {
        "水电": 53,
        "直接人工": 74,
        "折旧费": 133,
        "维度": "2024\n广东科技\n配件车间\n"
    },
    {
        "水电": 455,
        "直接人工": 620,
        "折旧费": 60,
        "维度": "2024\n广东科技\n管材车间\n"
    }
]
let compareMap = {
    '>': (name, value) => {
        return `e['${name}'] > ${value}`
    },
    '<': (name, value) => {
        return `e['${name}'] <  ${value}`
    },
    '==': (name, value) => {
        return `e['${name}'] ===  ${value}`
    },
    '!=': (name, value) => {
        return `e['${name}'] !==  ${value}`
    },
    '<=': (name, value) => {
        return `e['${name}'] <=  ${value}`
    },
    '>=': (name, value) => {
        return `e['${name}'] >=  ${value}`
    }
}
const criteria = {
    "dimension": {
        "或": [
            {
                "fieldType": "dimension",
                "radio": 2,
                "id": "workshop",
                "name": "车间",
                "assert": "或",
                "criteriaArr": [
                    {
                        "name": "车间",
                        "compare": "==",
                        "value": "配件车间"
                    }
                ]
            },
            {
                "fieldType": "dimension",
                "radio": 2,
                "id": "werks",
                "name": "工厂",
                "assert": "或",
                "criteriaArr": [
                    {
                        "name": "工厂",
                        "compare": "==",
                        "value": "广东科技"
                    },
                    {
                        "name": "工厂",
                        "compare": "==",
                        "value": "贵阳联塑"
                    }
                ]
            },
            {
                "fieldType": "dimension",
                "radio": 2,
                "id": "zyear",
                "name": "年度",
                "assert": "或",
                "criteriaArr": [
                    {
                        "name": "年度",
                        "compare": "==",
                        "value": "2020"
                    },
                    {
                        "name": "年度",
                        "compare": "==",
                        "value": "2021"
                    }
                ]
            }
        ]
    },
    "quota": {
        "或": [
            {
                "fieldType": "quota",
                "radio": 2,
                "id": "water",
                "name": "水电",
                "assert": "或",
                "criteriaArr": [
                    {
                        "name": "水电",
                        "compare": ">",
                        "value": "200"
                    },
                    {
                        "name": "水电",
                        "compare": "<",
                        "value": "100"
                    }
                ]
            }
        ],
        // "与": [
            // {
            //     "fieldType": "quota",
            //     "radio": 2,
            //     "id": "money",
            //     "name": "直接人工",
            //     "assert": "与",
            //     "criteriaArr": [
            //         {
            //             "name": "直接人工",
            //             "compare": ">",
            //             "value": "500"
            //         },
            //         {
            //             "name": "直接人工",
            //             "compare": "<",
            //             "value": "1000"
            //         }
            //     ]
            // },
            // {
            //     "fieldType": "quota",
            //     "radio": 2,
            //     "id": "zhejiu",
            //     "name": "折旧费",
            //     "assert": "与",
            //     "criteriaArr": [
            //         // {
            //         //     "name": "折旧费",
            //         //     "compare": ">",
            //         //     "value": "100"
            //         // },
            //         {
            //             "name": "折旧费",
            //             "compare": "<",
            //             "value": "200"
            //         }
            //     ]
            // }
        // ]
    }
}
let arr2 = []


function generateStr(criteria) {
    let typeArr = []
    let res = ''
    for (const k in criteria) {
        if (k === 'dimension') {
            for (const ck in criteria[k]) {
                let str = ''
                if (ck === '或') {
                    let ckArr = []
                    criteria[k][ck].forEach(dimen => {
                        let arr = dimen.criteriaArr.map(item => { return `e['维度'].includes('${item.value}')` })
                        let arrStr = arr.join('||')
                        ckArr.push(arrStr)
                    })
                    ckArr = ckArr.map(e => { return `(${e})` })
                    str += ckArr.join('&&')
                    typeArr.push(str)
                }
            }
        }
        if (k === 'quota') {
            for (const ck in criteria[k]) {
                let str = ''
                if (ck === '或') {
                    let ckArr = []
                    criteria[k][ck].forEach(quota => {
                        let arr = quota.criteriaArr.map(item => { return compareMap[item.compare](item.name, item.value) })
                        let arrStr = arr.join('||')
                        ckArr.push(arrStr)
                    })
                    ckArr = ckArr.map(e => { return `(${e})` })
                    str += ckArr.join('&&')
                    typeArr.push(str)
                }
                if (ck === '与') {
                    let ckArr = []
                    criteria[k][ck].forEach(quota => {
                        let arr = quota.criteriaArr.map(item => { return compareMap[item.compare](item.name, item.value) })
                        let arrStr = arr.join('&&')
                        ckArr.push(arrStr)
                    })
                    ckArr = ckArr.map(e => { return `(${e})` })
                    console.log(ckArr)
                    str += ckArr.join('&&')
                    typeArr.push(str)
                }
            }
        }
    }
    console.log(typeArr)
    res = typeArr.join('&&')
    return res
}
let str = generateStr(criteria)

const res = arr.filter((e => {
    return eval(str)
}))
console.log(res)
console 命令行工具 X clear

                    
>
console