我正在实现过滤器。它工作正常。问题在于它只是匹配单个对象值,而不是所有值匹配。
匹配的意思是,让它包含值中的任何单个字母
示例:这是我的对象
{name:"D",color:"Green",size:50}
如果我将过滤器对象传递为:
let filter1 = {color:"Blu",size:'50'};
目前,我通过匹配大小得到单个结果。但是颜色根本不匹配。因此结果应该为空。
如何处理对象中的所有值并获取过滤后的值。
代码:
const nestedFilter = (targetArray, filters) => targetArray.filter(o => Object.keys(filters).find(k => filters[k].includes(o[k])));
let products = [
{name:"A",color:"Blue",size:70},
{name:"B",color:"Blue",size:60},
{name:"C",color:"Black",size:70},
{name:"D",color:"Green",size:50}
];
let filter1 = {color:"Blu",size:'50'};
console.log(nestedFilter(products, filter1));
答案 0 :(得分:1)
将.find
调用替换为.every
。请注意,尽管通过使用includes
,您希望属性值是String。
如果您希望includes
在其他方面起作用,以便过滤器值可以是数据的子字符串,则应该执行以下操作:
const nestedFilter = (targetArray, filters) =>
targetArray.filter(o => Object.keys(filters).every(k =>
String(o[k]).includes(filters[k]))
)
)
o[k]
的值需要转换为字符串,否则无法将includes
应用于它(参见size
,这是一个数字)
答案 1 :(得分:0)
检查所传递的过滤器public struct DarkView<Content> : View where Content : View {
var darkContent: Content
var on: Bool
public init(_ on: Bool, @ViewBuilder content: () -> Content) {
self.darkContent = content()
self.on = on
}
public var body: some View {
ZStack {
if on {
Spacer()
.frame(minWidth: 0, maxWidth: .infinity, minHeight: 0, maxHeight: .infinity)
.background(Color.black)
.edgesIgnoringSafeArea(.all)
darkContent.frame(minWidth: 0, maxWidth: .infinity, minHeight: 0, maxHeight: .infinity).background(Color.black).colorScheme(.dark)
} else {
darkContent
}
}
}
}
extension View {
public func darkModeFix(_ on: Bool = true) -> DarkView<Self> {
DarkView(on) {
self
}
}
}
中的every
是否等于要迭代的对象上的相同条目。如果您要部分匹配并使用不同类型的变量,听起来您还需要先将它们强制转换为字符串,因此可以使用Object.entries
。
.includes