简体   繁体   English

使用带有多个选项的字符串数组过滤 javascript 数组

[英]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的任何组合进行过滤

  1. Example: ['public', 'secured', 'unsecured'];示例: ['public', 'secured', 'unsecured'];

This would filter the array [...items] by item.isPrivate = false , item.isSecured = true , item.isSecured = false这将通过item.isPrivate = falseitem.isSecured = trueitem.isSecured = false过滤数组[...items]

  1. Example: ['public', 'unsecured'];示例: ['public', 'unsecured'];

This would filter the array [...items] by item.isPrivate = false , item.isSecured = false这将通过item.isPrivate = falseitem.isSecured = false过滤数组[...items]

  1. Example: ['private', 'unsecured'];示例: ['private', 'unsecured'];

This would filter the array [...items] by item.isPrivate = true , item.isSecured = false这将通过item.isPrivate = trueitem.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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM