Bru*_*lda 1 javascript lodash graphql
我的查询过滤器
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)
)
)),
},
Run Code Online (Sandbox Code Playgroud)
我的架构
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]!
}
`;
Run Code Online (Sandbox Code Playgroud)
现在(正如我所想)我的过滤器作为ANDmysql 中的条件工作。
例如,我
首先有3个字段
{
value: ["3", "5"]
}
Run Code Online (Sandbox Code Playgroud)
第二
{
value: ["3", "5", "7"]
}
Run Code Online (Sandbox Code Playgroud)
第三
{
value: ["3"]
}
Run Code Online (Sandbox Code Playgroud)
我的参数中的变量是["3"]
因为我使用的是 isEqual 函数,它只会返回第三个字段。这是不正确的,因为["3"]在所有三个领域都是如此。lodash 是否有另一个功能可以解决这个小问题?
有两种不同的解决方案,具体取决于您想要实现的目标。
对于数组始终包含 1 个元素的简单情况value,这两个选项都可以使用。
我将使用这个论点来展示差异:["3", "7"]
如果您希望获得所有 3 个字段"3",因为在变量中至少找到了数组中的一项(在本例中),customVal.value那么您应该使用lodash 的交集并检查结果是否不是空数组。就像是:
intersection(customVal.value, value).length > 0
Run Code Online (Sandbox Code Playgroud)
如果在和 中至少找到一项,则此表达式为真。customVal.valuevalue
如果在我的示例中,您希望只获得第二个字段,因为数组中的所有项目都必须在变量中找到,那么customVal.value您应该使用lodash 的差异并检查结果是否为空数组。就像是:
difference(value, customVal.value).length === 0
Run Code Online (Sandbox Code Playgroud)
在这种情况下,参数的顺序很重要。
如果 中的所有项目也在value中找到,则此表达式为真customVal.value。因为我们用作第一个参数,customVal.value所以不会返回其他值。differencevalue
(此选项也可以通过intersection将结果的长度与参数的数组长度进行比较来实现)