使用模糊匹配查找集合中的对象

Bra*_*ham 5 javascript lodash

我有一个看起来像这样的集合:

const collection = [
    {
        name: 'THIS_ITEM',
        conditions: {
            oneCondition: false,
            anotherCondition: false,
            yourCondition: false,
            myCondition: false
        }
    }, {
        name: 'THAT_ITEM',
        conditions: {
            oneCondition: false,
            anotherCondition: false,
            yourCondition: true,
            myCondition: false
        }
    }, {
        name: 'THOSE_ITEMS',
        conditions: {
            oneCondition: true,
            anotherCondition: false,
            yourCondition: null,
            myCondition: false
        }
    }
];
Run Code Online (Sandbox Code Playgroud)

......然后是一个看起来像这样的对象:

const condition = {
    oneCondition: true,
    anotherCondition: false,
    yourCondition: true,
    myCondition: false
};
Run Code Online (Sandbox Code Playgroud)

我正在尝试将condition对象与嵌套conditions对象进行collection匹配以找到匹配的对象,以便我可以name从匹配的条目中检索属性。

让我陷入循环的事情是conditions属性可能具有“模糊”值。我的意思是,如果源collection中的任何属性设置为true或者false它们必须condition完全匹配这些值。但是,如果源属性collection的值为null它可以匹配任何 truefalse

例子:

这些将匹配:

const condition = {
    oneCondition: true,
    anotherCondition: false,
    yourCondition: true,
    myCondition: false
};

const collection = [
    …
    }, {
        name: 'THOSE_ITEMS',
        conditions: {
            oneCondition: true,
            anotherCondition: false,
            yourCondition: null,
            myCondition: false
        }
    }
];
Run Code Online (Sandbox Code Playgroud)

这些不会:

const condition = {
    oneCondition: true,
    anotherCondition: false,
    yourCondition: true,
    myCondition: false
};

const collection = [
    …
    }, {
        name: 'THAT_ITEM',
        conditions: {
            oneCondition: false,
            anotherCondition: false,
            yourCondition: true,
            myCondition: false
        }
    }, {
    …
];
Run Code Online (Sandbox Code Playgroud)

有什么建议?我正在使用 Lodash,但似乎无法想象没有过于冗长和嵌套的混合物的任何解决方案。

Nin*_*olz 2

您可以使用Array#filterwithArray#every作为条件并针对null值作为通配符进行测试。

var collection = [{ name: 'THIS_ITEM', conditions: { oneCondition: false, anotherCondition: false, yourCondition: false, myCondition: false } }, { name: 'THAT_ITEM', conditions: { oneCondition: false, anotherCondition: false, yourCondition: true, myCondition: false } }, { name: 'THOSE_ITEMS', conditions: { oneCondition: true, anotherCondition: false, yourCondition: null, myCondition: false } }],
    condition = { oneCondition: true, anotherCondition: false, yourCondition: true, myCondition: false },
    result = collection.filter(o =>
        Object.keys(condition).every(k =>
            o.conditions[k] === null || o.conditions[k] === condition[k]
        )
    );

console.log(result);
Run Code Online (Sandbox Code Playgroud)
.as-console-wrapper { max-height: 100% !important; top: 0; }
Run Code Online (Sandbox Code Playgroud)