如何使用lodash检查另一个数组中的数组值

时间:2018-04-04 13:29:24

标签: 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)
                )
                )),
    },

我的架构

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的另一个功能可以解决这个小问题吗?

1 个答案:

答案 0 :(得分:2)

根据您想要达到的目标,有两种不同的解决方案。

对于value数组始终包含1个元素的简单情况,两个选项都有效。

我将使用此参数来显示差异:["3", "7"]

选项1:字段必须包含任何值

如果您希望获得所有3个字段,因为数组中至少有一个项目(在这种情况下为"3")在变量和customVal.value中找到,那么您应使用lodash's intersection并检查结果是否为空数组。类似的东西:

intersection(customVal.value, value).length > 0

如果在customVal.valuevalue中同时找到至少一个项,则此表达式为真。

选项2:字段必须包含所有值

如果使用我的示例,您希望仅获得第二个字段,因为必须在变量和customVal.value中找到数组中的所有项目,然后您应该使用lodash's difference并检查结果是否为空数组。类似的东西:

difference(value, customVal.value).length === 0

在这种情况下参数的顺序很重要。

如果在value中也找到customVal.value中的所有项,则此表达式为true。 customVal.value中的其他值不会被difference返回,因为我们使用value作为第一个参数。

(使用intersection也可以实现此选项,并将结果的长度与参数的数组长度进行比较)