Graphql过滤函数返回all而不是指定的

时间:2018-04-04 11:01:04

标签: javascript lodash graphql

我想通过提供参数来过滤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]!

  }
`; 

感谢您的任何建议。

1 个答案:

答案 0 :(得分:2)

filter函数迭代数组中的每个项目,并返回包含已过滤项目的新数组。如果找不到任何项,则返回一个空数组。 空数组的计算结果为truthy

在您的情况下,外部过滤器会过滤链接(result)。将返回由外部过滤器函数评估为truthy的每个链接。 外部过滤器函数使用内部过滤器的结果,内部过滤器始终是一个数组,有时是空数组,但总是truthy值(假设没有抛出异常)。换句话说,外部过滤器功能将始终返回所有链接。

您的console.log会正确记录项目,因为代码已执行,即使我们知道它对外部过滤器的结果没有影响。

可能的解决方案

如果将val.custom_attributes.filter的内部调用替换为val.custom_attributes.find,则内部查找函数将返回作为对象的custom_attribute,因此返回truthy或者它将返回undefined如果没有项目符合条件。由于undefinedfalsy,因此外部过滤器函数不会返回最终结果中没有相关自定义属性的项目。