从打字稿中的对象列表中查找键的唯一值的有效方式

阿卡什·夏尔马

在此处输入图片说明

我正在开发一个具有

  1. 一组过滤器
  2. 并记录在表格中

表格中的列对应于过滤器。过滤器随时都包含来自相应列的唯一值作为选项。

对于一条记录,一列可以包含多个值(即,来自相应过滤器的多个选项)

当用户从过滤器中选择一个选项时,表中的记录将被过滤,过滤后的结果(根据用户的选择)将显示给用户。

一旦得出过滤记录集,就可以通过为每一列查找唯一值来从过滤记录集中得出每个过滤器的唯一值。

Filter对象的键对应于Record对象的列,我有一个记录列表和一个过滤器列表。我想遍历这两个列表,并找到每个键的列的唯一值。

我正在使用以下逻辑从邮件中查找过滤器的唯一选项。

export function filterOptionsService(records: Record[], filters: RecordFilter[]): RecordFilter[] {
    const newFilters: RecordFilter[] = filters.map(filter => {

        //logic to find all values for a column from the set of records 
        const filterOptions = records.reduce((uniqueList, record) => uniqueList.concat(record[filter.key]), []);

        //logic to find unique values for a column from the set of records
        //which act as options of corresponding filters.
        const uniqueOptions = uniqBy(filterOptions, (opt) => filter.valueFunction ? filter.valueFunction(opt) : opt);

        const filterOptions: FilterOption[] = uniqueOptions.map(value => {
            return {
                label: filter.labelFunction ? filter.labelFunction(value) : value,
                value: filter.valueFunction ? filter.valueFunction(value) : value,
            };
        });
        filter.options = orderBy(dropListOptions, 'label');

        //here is my logic to find the count of each option, present in the filtered records
        filter.options = filter.options.map(option => ({
            ...option,
            count: filter.valueFunction
                ? filterOptions.filter(value => filter.valueFunction(value) === option.value).length
                : filterOptions.filter(value => value === option.value).length
        }));
        return filter;
    });
    return newFilters;
}

interface Filter {
    key: string;
    labelFunction?: Function;
    valueFunction?: Function;
    order: number;
    multiple: boolean;
    options: DropListOption[];
    values: DropListOption[];
}


interface Record {
    column1: string;
    column2: string;
    column3: string | string[];
    .
    .
    columnN: string;
}

下面的逻辑在我的代码中花费的时间最多。8k记录大约需要7秒。

const filterOptions = records.reduce((uniqueList, record) => 
                              uniqueList.concat(record[filter.key]), []); 

我无法使我的代码性能更好。请您提出我要去哪里的建议。

这是typescrip操场上的示例代码 https://www.typescriptlang。组织/播放?#代码/ FASwdgLgpgTgZgQwMZQAQDEQBtowPIAOEIA9mKgN7Co201YIBGUWAXKgM4QzgDmA3NTq0AbgiwBXKOwRgAnoOG1kxEVAD87RiRJYosxUtQEEcrCQQATTalkKhSpCQmQbYCQFtmMQzQC + -LTA1AD0IRwIHgR6qGJ6HKhwJDCoANZQcrYwaAQwJASwEHIAjAA0xnkFMEUATKigkLCIKKgASlBOMJaYOLCUDsLpcuxcPGAC9UaoDMxY6C5IxGQ282CLpGC + wnFSq + vL7HtLmwN0yZaw7O5esFt0HhI4INHSqNq6 + IDT + ccch9i4QjHADaAF07qJxFI-hgAbAgRswVsAkFgGEKvlqiAoAkSHA2h1zqgkAwOAkENlOJE0AgEkNUHiCZ1unCUiTaRw0SFUBAABYgBICzggKJYEBwbGWVDZKo4yAIY6oDyZFQScTE0kJXm0pV2JXJHKVQrYzngXDNNCtEgAd36dFy + UKJRG3D4SIGDqqtRdYwEwACwWATjAXFQ4BAxHEVutMOjYNQAF5UMDTlNhBRPU7iqxgQAiMhQXPlXN87KF0GlTPVOQ1Vi5phIXN + UqptO0DNG6vZvMStRF1C5sDgcuVzve3MXOBNlttqYdx1dnP5sCF4ulqCrge9zeD4e5itV8cNputtPg4JBMIASVsHgZYCwKrJIF4Q-GsShOJ5JDSGQxXsyJIUg4EVonFEAkAVDYgzIUNw0jOZWVjQkuh6XB4yTFNZyUCghjrQ8Sn7c5LjKJVHmIF5WEQLAOCgcofg2P4wXKHYcXYMFm1PNNcIyfCxxrIiukuGpygeJ5KOo2j6KIRicwrD9JDY5NQT8GguKMc9gglXp8Bk2CAGVYBECCoAACngkAoxtDhSgs8Q0NgDgAEpBGCdEb21NRUGKAAWRJWQZRgACsOggTl0WtXkoHIDyEC8gAOVJpRtQKQsWBI + TQWYUuySwJBaTEICgsgeQQdIEgANgAWgAdk4QkwEsDgADpgDgBZFW0wE9JDQyYGMlBTLyGN2DjeSusc0aUJZHSwSc-pTgmmAWo8BACFMpbEwAPjtIwwnMXgIO-fzGtsLAsAU6FEmSWxiV0TxyDgPI70y + qIAZfFsmZBJT2DUMloRWDE2SmNmty-KzNMlwQAARykAAZAUIHKYb5oTHbUGhuGoERrhmuDSCICGm1gSW5qhlBJzyjmwIuN + 2CPmag7TIAcgBnqOBZ0p2d + FzsNbPwXP9QMgA

贾卡尔兹

我认为您遇到的性能问题是Array.prototype.concat()不会修改现有数组,而是返回一个新数组。不变性是很好的,但是它似乎与您的用例无关:uniqueList除了最后一个数组,您创建的每个数组都将被丢弃。在JavaScript中,对象的创建相当快,但是创建数千个数组对象只是立即将它们扔掉,这会减慢速度。

我的建议是替换concat()为修改现有数组的内容,例如Array.prototype.push()

也就是说,你可以改变

const filterOptions = rows.reduce(
  (uniqueList, row) => uniqueList.concat(row[filter.key]), []
);

const filterOptions: string[] = [];
for (let row of rows) filterOptions.push(...row[filter.key]);

当我运行模拟时,创建6000行和14个过滤器(请参见下面的操场链接),该concat()版本大约需要7.5秒,而该push()版本大约需要38milliseconds希望〜200改善的因素在您的环境中得以保持,并产生足以满足您需求的影响。

请注意,我没有处理您原始问题似乎具有的任何“唯一化”或“功能”方面,因为您的可复制示例代码也没有涉及到它们。通过对象键而不是数组,甚至通过,更容易计算出唯一字符串Set但同样,希望更改concat()push()对您来说已经足够。

操场上的代码链接

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

从打字稿中的值获取枚举的键

来自分类Dev

从打字稿对象中查找带有填充值的属性名称

来自分类Dev

以最有效的方式确保 dplyr::summarise() 中的唯一值

来自分类Dev

在std :: vector中查找每个唯一值的频率的有效方法

来自分类Dev

在std :: vector中查找每个唯一值的频率的有效方法

来自分类Dev

从打字稿中的数组中的字符串派生键以定义对象属性名称

来自分类Dev

从打字稿中的部分对象中过滤通用列表

来自分类Dev

如何克服打字稿中由函数修改的值的有效断言测试?

来自分类Dev

如何从打字稿中的typeof对象中删除索引

来自分类Dev

打字稿-在多维对象中查找匹配的键和路径

来自分类Dev

无法从打字稿中的 json 对象获取数组响应

来自分类Dev

如何从打字稿中的JSON中提取特定值

来自分类Dev

从打字稿中的扩展类返回通用值

来自分类Dev

从打字稿中的地图中删除数组值

来自分类Dev

查找对象中某个值出现的次数-打字稿

来自分类Dev

python中最有效的计算方式在对列表中查找对

来自分类Dev

如何让打字稿检查有效的对象属性名称

来自分类Dev

从打字稿中致电alertifyjs

来自分类Dev

从打字稿中的CLI解析文本

来自分类Dev

什么是使元组列表中的元素在python中唯一的有效方法?

来自分类Dev

快速查找C#中唯一词的有效方法

来自分类Dev

如何以最有效的方式在排序的C ++向量中查找值?

来自分类Dev

查找HDF5表中列中每个唯一值的上一个时间戳的有效方法

来自分类Dev

从对象列表中获取具有最大值的对象的最有效方法

来自分类Dev

查找HDF5表中一列中每个唯一值的上一个时间戳的有效方法

来自分类Dev

查找列表中添加分数平均排名的有效方法。可能是更有效的排序方式或数学方式?

来自分类常见问题

基于唯一值将数据帧子集化为较小的有效方式,并同时将其写到csv文件中

来自分类Dev

有效地解析和提取文本文件中的唯一值

来自分类Dev

如何限制状态转换值在Java中唯一有效的价值?

Related 相关文章

  1. 1

    从打字稿中的值获取枚举的键

  2. 2

    从打字稿对象中查找带有填充值的属性名称

  3. 3

    以最有效的方式确保 dplyr::summarise() 中的唯一值

  4. 4

    在std :: vector中查找每个唯一值的频率的有效方法

  5. 5

    在std :: vector中查找每个唯一值的频率的有效方法

  6. 6

    从打字稿中的数组中的字符串派生键以定义对象属性名称

  7. 7

    从打字稿中的部分对象中过滤通用列表

  8. 8

    如何克服打字稿中由函数修改的值的有效断言测试?

  9. 9

    如何从打字稿中的typeof对象中删除索引

  10. 10

    打字稿-在多维对象中查找匹配的键和路径

  11. 11

    无法从打字稿中的 json 对象获取数组响应

  12. 12

    如何从打字稿中的JSON中提取特定值

  13. 13

    从打字稿中的扩展类返回通用值

  14. 14

    从打字稿中的地图中删除数组值

  15. 15

    查找对象中某个值出现的次数-打字稿

  16. 16

    python中最有效的计算方式在对列表中查找对

  17. 17

    如何让打字稿检查有效的对象属性名称

  18. 18

    从打字稿中致电alertifyjs

  19. 19

    从打字稿中的CLI解析文本

  20. 20

    什么是使元组列表中的元素在python中唯一的有效方法?

  21. 21

    快速查找C#中唯一词的有效方法

  22. 22

    如何以最有效的方式在排序的C ++向量中查找值?

  23. 23

    查找HDF5表中列中每个唯一值的上一个时间戳的有效方法

  24. 24

    从对象列表中获取具有最大值的对象的最有效方法

  25. 25

    查找HDF5表中一列中每个唯一值的上一个时间戳的有效方法

  26. 26

    查找列表中添加分数平均排名的有效方法。可能是更有效的排序方式或数学方式?

  27. 27

    基于唯一值将数据帧子集化为较小的有效方式,并同时将其写到csv文件中

  28. 28

    有效地解析和提取文本文件中的唯一值

  29. 29

    如何限制状态转换值在Java中唯一有效的价值?

热门标签

归档