SOURCE

function combination(originArr, count, condition, resArr = []) {
    let res = []
    if (resArr.length == 0) {
        res = originArr.map(el => {
            return [el]
        })
    } else {
        for (const resItem of resArr) {
            const tmpItemRes = originArr.map(el => {
                return resItem.concat([el])
            })
            res = res.concat(tmpItemRes)
        }
    }

    if (count === 1) {
        if (condition) {
            const tmpRes = []
            for (const item of res) {
                if (condition(item, tmpRes, res)) {
                    tmpRes.push(item)
                }
            }
            return tmpRes
        } else {
            return res
        }
    } else {
        return combination(originArr, 1, condition, res)
    }
}

const testArr = [1, 2, 3, 4]

const res = combination(testArr, 2, (items, res1) => {
    let tag = true
    const tmpArr =[]
    for(const item of items) {
        if (tmpArr.indexOf(item) > -1) {
            tag = false
            break
        } else {
            tmpArr.push(item)
        }
    }

    for(const resItems of res1) {
        let tmpTag = false
        for(const item of resItems) {
            if (items.indexOf(item) === -1) {
                tmpTag = true
                break
            }
        }
        if (!tmpTag) {
            tag = false
            break
        }
    }

    return tag
})
console.log(res)
console 命令行工具 X clear

                    
>
console