[英]filter javascript array with a string array with multiple options
I have the following我有以下
let foo = ['public', 'private', 'secured', 'unsecured']; // value to search, it can be any combination
['secured', 'unsecured'], ['public', 'secured']
etc... ['secured', 'unsecured'], ['public', 'secured']
等等...
ARRAY大批
[
{ id: 1, isPrivate: true, isSecured: true },
{ id: 2, isPrivate: false, isSecured: true },
{ id: 3, isPrivate: true, isSecured: false },
{ ID: 4, isPrivate: false, isSecured: false }
];
[...items].filter(x => filterLabel(x, foo));
filterLabel(x, foo): boolean {
switch (foo[0]) {
case 'private': return x.isPrivate;
case 'public': return !x.isPrivate;
case 'secured': return x.isSecured;
case 'unsecured': return !x.isSecured;
default: return true;
}
This WORKS but it only filters by the first item of the array, i can't figure out how can i filter by using any combination of foo
这有效,但它仅按数组的第一项过滤,我不知道如何使用foo
的任何组合进行过滤
['public', 'secured', 'unsecured'];
示例: ['public', 'secured', 'unsecured'];
This would filter the array [...items]
by item.isPrivate = false
, item.isSecured = true
, item.isSecured = false
这将通过item.isPrivate = false
、 item.isSecured = true
、 item.isSecured = false
过滤数组[...items]
['public', 'unsecured'];
示例: ['public', 'unsecured'];
This would filter the array [...items]
by item.isPrivate = false
, item.isSecured = false
这将通过item.isPrivate = false
, item.isSecured = false
过滤数组[...items]
['private', 'unsecured'];
示例: ['private', 'unsecured'];
This would filter the array [...items]
by item.isPrivate = true
, item.isSecured = false
这将通过item.isPrivate = true
, item.isSecured = false
过滤数组[...items]
PD: it can be solved by comparing any of the combination but i want to avoid this PD:可以通过比较任何组合来解决,但我想避免这种情况
const hash = new Set(foo);
const isPrivate = hash.has('private');
const isPublic = hash.has('public');
const isSecured = hash.has('secured');
const isUnsecured = hash.has('unsecured');
if (isPrivate && !isPublic && !isSecured && !isUnsecured) {
return item.isPrivate;
}
if (!isPrivate && isPublic && !isSecured && !isUnsecured) {
return !item.isPrivate;
}
if (!isPrivate && !isPublic && isSecured && !isUnsecured) {
return item.isSecured;
}
// and so on... with all the combinations
You could filter the array ba taking off contradictional labels and take for the rest a function.您可以过滤阵列 ba,去除矛盾的标签,并为 rest 和 function 取值。
const
filterLabel = filter => {
const
p = ['private', 'public'],
s = ['secured', 'unsecured'],
fn = {
private: ({ isPrivate }) => isPrivate,
public: ({ isPrivate }) => !isPrivate,
secured: ({ isSecured }) => isSecured,
unsecured: ({ isSecured }) => !isSecured
};
if (p.every(v => filter.includes(v)) filter = filter.filter(v => !p.includes(v));
if (s.every(v => filter.includes(v)) filter = filter.filter(v => !s.includes(v));
return o => filter.every(k => fn[k](o));
},
foo = ['public', 'private', 'secured', 'unsecured'],
result = items.filter(filterLabel(foo));
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.