【问题标题】:Dynamic conditional chaining functions in ES6ES6 中的动态条件链函数
【发布时间】:2021-04-01 05:06:42
【问题描述】:

我正在构建具有多个搜索条件的搜索功能。

有什么方法可以动态生成单行可链接过滤器,包括自定义方法。

数据:

SN EventDate Activity Devices Description
1 12/12/20 Sports Fitbit Archived rewards via running
2 13/12/20 Sports Apple Achieved rewards via running
3 14/12/20 Purchase NA Purchased coins for purchase
4 14/12/20 Sports Fitbit Archived rewards via running
5 16/12/20 Sports Fitbit Archived rewards via running

从下面的过滤条件我期待

SN EventDate Activity Devices Description
1 12/12/20 Sports Fitbit Archived rewards via running
2 13/12/20 Sports Apple Achieved rewards via running
4 14/12/20 Sports Fitbit Archived rewards via running

输入过滤条件:

const input = [
  {
    Field: 'Activity',
    Operation: 'EQUALS',
    Values: 'Sports'
  },
  {
    Field: 'EventDate',
    Operation: 'DATEBETWEEN',
    Values: {startDate:2020-12-12, endDate: 2020-12-15}
  },
  {
    Field: 'Devices',
    Operation: 'INCLUDES'
    Values: {Fitbit,Apple}
  },
  {
    Field: 'All', // if ALL then all fields else array of fields
    Operation: 'GLOBAL',
    Values: 'Run'//keyword to search
  }
];

类似下面的东西

global(objects, keyword) {
    retturn objects.filter(object => Object.values(object).some(i => i.includes(keyword)));
}

const filteredList = FilterModule
                    .include(field, array)
                    .equals(field, value)
                    .equals(field, value)
                    .global(field, array);

需要根据输入过滤条件生成动态过滤模块,所有条件都是'AND'条件。

仅通过 JavaScript

【问题讨论】:

  • 为什么Values 是字符串或无效语法?
  • 您想生成 JavaScript 代码吗?我真的不明白这里的问题...请同时修复代码中的语法错误。
  • 是的,但是由于语法错误,示例不清楚。目前尚不清楚Values 是否应该等于带有一些无效 JS 代码的字符串......很难看到你在那里做什么。修复语法错误并消除歧义对您来说很难......
  • 没有反应?此外,global... 的第一个参数是“All”,并且在实现中您将 objects 作为参数。不知道如何匹配...想澄清这一切吗?

标签: javascript arrays list ecmascript-6


【解决方案1】:

您可以在键/值上创建带有闭包的函数,并期望对象进行检查。

DATEBETWEEN 需要 ISO 8601 格式的日期。

const
    data = [{ SN: 1, EventDate: '2020-12-12', Activity: 'Sports', Devices: 'Fitbit', Description: 'Archived rewards via running' }, { SN: 2, EventDate: '2020-12-13', Activity: 'Sports', Devices: 'Apple', Description: 'Achieved rewards via running' }, { SN: 3, EventDate: '2020-12-14', Activity: 'Purchase', Devices: 'NA', Description: 'Purchased coins for purchase' }, { SN: 4, EventDate: '2020-12-14', Activity: 'Sports', Devices: 'Fitbit', Description: 'Archived rewards via running' }, { SN: 5, EventDate: '2020-12-16', Activity: 'Sports', Devices: 'Fitbit', Description: 'Archived rewards via running' }],
    input = [
        { Field: 'Activity', Operation: 'EQUALS', Values: 'Sports' },
        { Field: 'EventDate', Operation: 'DATEBETWEEN', Values: { startDate: '2020-12-12', endDate: '2020-12-15' } },
        { Field: 'Devices', Operation: 'INCLUDES', Values: ['Fitbit', 'Apple'] },
        { Field: 'All', Operation: 'GLOBAL', Values: 'Run' }
    ],
    operators = {
        EQUALS(k, v) { return o => o[k] === v; },
        DATEBETWEEN(k, v) { return o => o[k] >= v.startDate && o[k] <= v.endDate; },
        INCLUDES(k, v) { return o => v.includes(o[k]); },
        GLOBAL(k, v) { v = v.toLowerCase(); return o => Object.values(o).some(s => s.toString().toLowerCase().includes(v)); }
    },
    filters = input.map(({ Field, Operation, Values }) => operators[Operation](Field, Values)),
    result = data.filter(o => filters.every(f => f(o)));

console.log(result);
.as-console-wrapper { max-height: 100% !important; top: 0; }

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-11-07
    • 2016-06-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-02-26
    • 1970-01-01
    相关资源
    最近更新 更多