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

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

Tal*_*l Z 5

有两种不同的解决方案,具体取决于您想要实现的目标。

对于数组始终包含 1 个元素的简单情况value,这两个选项都可以使用。

我将使用这个论点来展示差异:["3", "7"]

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

如果您希望获得所有 3 个字段"3",因为在变量中至少找到了数组中的一项(在本例中),customVal.value那么您应该使用lodash 的交集并检查结果是否不是空数组。就像是:

intersection(customVal.value, value).length > 0
Run Code Online (Sandbox Code Playgroud)

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

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

如果在我的示例中,您希望只获得第二个字段,因为数组中的所有项目都必须在变量中找到,那么customVal.value您应该使用lodash 的差异并检查结果是否为空数组。就像是:

difference(value, customVal.value).length === 0
Run Code Online (Sandbox Code Playgroud)

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

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

(此选项也可以通过intersection将结果的长度与参数的数组长度进行比较来实现)