我想在给定一个filter对象的情况下过滤一个数组
function remove (array, filter) {
// magic
}
filter
是一个大小可变的对象,可以有任意数量的键/值
它的作用应该如下
const products = [
{ size: 'S', color: 'blue' },
{ size: 'L', color: 'red' },
{ size: 'S', color: 'red' },
{ size: 'L', color: 'green' },
]
// With a filter of keys/value it filters for the existing key/values
const filteredProducts1 = remove(products, { size: 'S', color: 'red' })
console.log(filteredProducts1)
/*
[
{ size: 'S', color: 'blue' },
{ size: 'L', color: 'red' },
{ size: 'L', color: 'green' },
]
*/
// With less key/value than the object array, it filters for the existing key/value
const filteredProducts2 = remove(products, { size: 'S' })
console.log(filteredProducts2)
/*
[
{ size: 'L', color: 'red' },
{ size: 'L', color: 'green' },
]
*/
// With more keys/values than the object array it discard the non-existing key/value
const filteredProducts1 = remove(products, { size: 'S', color: 'red', type: 'dress' })
console.log(filteredProducts1)
/*
[
{ size: 'S', color: 'blue' },
{ size: 'L', color: 'red' },
{ size: 'L', color: 'green' },
]
*/
我的问题是从过滤器对象构建动态条件
我想改变信仰
{ key1: value1, key2: value2, ... , keyN: valueN }
进入
condition 1 && condition2 && ... & conditionN
4条答案
按热度按时间cedebl8k1#
你可以使用
some
来返回true,如果至少有一个条件存在并且不等于filter。你甚至可以使用
x[k]
来代替x.hasOwnProperty(k)
,如果它保证有一些键指向的值是假值(undefined
,null
,0
..,''
)。另外,如果您的环境(浏览器/节点)支持
Object.hasOwn
,MDN推荐使用Object.hasOwn
而不是Object.hasOwnProperty
。edit修复问题
remove(products,{ type:'dress' })删除不应该删除的所有内容
现在我从对象中现有的过滤器条目中过滤出字段进行检查,如果过滤器条目为空,则返回整个数组
mzmfm0qo2#
您可以确定过滤器中的任何键值对是否存在于数组中的每个对象中:
ocebsuys3#
这个怎么样,变量过滤器将返回匹配过滤器[真,假,真]等布尔值的数组,然后只要返回数组项,如果包含在过滤器变量假
ttygqcqt4#
我认为你是正确的,解决问题的关键是正确地实现一个函数,它可以根据传递的键值来决定是否应该删除或保留一个项,并且应该能够动态地处理你的需求。
这里有一个建议:
关于此实现的一些注意事项:
shouldkeep
的思想是,它迭代过滤器对象的键,只有当它遍历所有键而没有完全匹配的值时,才返回true(这意味着“保持”)shouldkeep = kvs => obj =>
可能看起来很奇怪,但它实际上非常有用。它被称为 currying,意味着你可以将一个参数应用于函数,并返回一个需要下一个参数的函数。有了这个,你可以做类似products, {size: 'S'})
的事情,它返回一个函数,你可以将其用作filter
的参数。整洁!