我的查询过滤器
export const resolvers = {
Query: {
allItems: (_, { value }) => getAllLinks()
.then(result => filter(result, val => val.custom_attributes
.find(customVal =>
customVal.attribute_code === 'category_ids' && isEqual(customVal.value, value)
)
)),
},
我的架构
const typeDefs = `
type Item {
id: ID!
name: String
price: Float
custom_attributes: [CUSTOM_ATTRIBUTES]
}
union CUSTOM_ATTRIBUTES = CustomString | CustomArray
type CustomString {
attribute_code: String
value: String
}
type CustomArray {
attribute_code: String
value: [String]
}
type Query {
allItems(value : [String]): [Item]!
}
`;
目前(正如我所想)我的过滤器在 mysql 中作为 AND
条件工作。
例如我有3个字段
首先
{
value: ["3", "5"]
}
第二
{
value: ["3", "5", "7"]
}
第三
{
value: ["3"]
}
我的参数变量是["3"]
因为我使用 isEqual 函数,它只会返回第三个字段。这是不正确的,因为 ["3"]
位于所有三个字段中。 lodash 是否有另一个功能可以解决这个小问题?
最佳答案
有两种不同的解决方案,具体取决于您想要实现的目标。
对于简单的情况,value
数组始终包含 1 个元素,这两个选项都可以。
我将使用这个参数来显示差异:["3", "7"]
选项1:字段必须包含任何值
如果您希望获得所有 3 个字段,因为在变量和 "3"
中至少找到了数组中的一项(在本例中为 customVal.value
)那么你应该使用lodash's intersection并检查结果是否不是空数组。像这样的东西:
intersection(customVal.value, value).length > 0
如果在 customVal.value
中都找到至少一个项目,则此表达式为 true并在 value
.
选项2:字段必须包含所有值
如果在我的示例中,您希望仅获得第二个字段,因为数组中的所有项目都必须在变量和 customVal.value
中找到那么你应该使用lodash's difference并检查结果是否为空数组。像这样的东西:
difference(value, customVal.value).length === 0
在这种情况下参数的顺序很重要。
如果 value
中的所有项,则此表达式为 true也可以在 customVal.value
中找到。 customVal.value
中的其他值difference
不会返回因为我们使用了value
作为第一个参数。
(此选项也可以通过 intersection
并将结果的长度与参数的数组长度进行比较来实现)
关于javascript - 如何使用 lodash 检查另一个数组中的数组值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49652327/