[英]How to check for array values in another array with lodash
我的查询过滤器
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是否有另一个函数可以解决此小问题?
根据要实现的目标,有两种不同的解决方案。
对于value
数组始终包含1个元素的简单情况,这两个选项都将起作用。
我将使用此参数来显示差异: ["3", "7"]
如果您希望获得所有3个字段,因为在变量和customVal.value
找到了数组中的至少一项(本例中为"3"
),则应使用lodash的交集并检查结果是否不是空数组。 就像是:
intersection(customVal.value, value).length > 0
如果在customVal.value
和value
都找到至少一项,则此表达式为true。
如果在我的示例中您只希望获取第二个字段,因为必须在变量和customVal.value
找到数组中的所有项目,则应使用lodash的差值并检查结果是否为空数组。 就像是:
difference(value, customVal.value).length === 0
在这种情况下,参数的顺序很重要。
如果还在customVal.value
找到所有 value
项目,则此表达式为true。 customVal.value
其他值不会因difference
而返回,因为我们使用value
作为第一个参数。
(也可以通过intersection
并将结果的长度与参数的数组长度进行比较来实现此选项)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.