如何通过匹配所有值而不是一个值来过滤对象数组

时间:2019-06-22 07:11:14

标签: javascript filter ecmascript-7

我正在实现过滤器。它工作正常。问题在于它只是匹配单个对象值,而不是所有值匹配。

匹配的意思是,让它包含值中的任何单个字母

示例:这是我的对象

{name:"D",color:"Green",size:50}

如果我将过滤器对象传递为:

let filter1 = {color:"Blu",size:'50'};

目前,我通过匹配大小得到单个结果。但是颜色根本不匹配。因此结果应该为空。

如何处理对象中的所有值并获取过滤后的值。

Live Demo

代码:

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));

2 个答案:

答案 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