我想通过提供参数来过滤graphql查询,但问题是即使在过滤器变量中指定了结果,也就是所有项目。我正在使用lodash的功能。
这是我的过滤功能
export const resolvers = {
Query: {
// allItems: (_, { value }) => getAllLinks().then(result => filter(result, {value: value})),
allItems: (_, { value }) => getAllLinks()
.then(result => filter(result, val => val.custom_attributes
.filter(customVal =>
customVal.attribute_code === 'category_ids' && isEqual(customVal.value , value)
))),
// allItems: (_, { value }) => getAllLinks().then(result => console.log(result)),
},
对我来说最心思的是,如果我要添加
customVal.attribute_code === 'category_ids' && isEqual(customVal.value , value)
? console.log(customVal)
: null
log会返回正确的对象数。这是我的架构。
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]!
}
`;
感谢您的任何建议。
答案 0 :(得分:2)
filter
函数迭代数组中的每个项目,并返回包含已过滤项目的新数组。如果找不到任何项,则返回一个空数组。 空数组的计算结果为truthy
。
在您的情况下,外部过滤器会过滤链接(result
)。将返回由外部过滤器函数评估为truthy
的每个链接。
外部过滤器函数使用内部过滤器的结果,内部过滤器始终是一个数组,有时是空数组,但总是truthy
值(假设没有抛出异常)。换句话说,外部过滤器功能将始终返回所有链接。
您的console.log
会正确记录项目,因为代码已执行,即使我们知道它对外部过滤器的结果没有影响。
如果将val.custom_attributes.filter
的内部调用替换为val.custom_attributes.find
,则内部查找函数将返回作为对象的custom_attribute
,因此返回truthy
或者它将返回undefined
如果没有项目符合条件。由于undefined
为falsy
,因此外部过滤器函数不会返回最终结果中没有相关自定义属性的项目。