【问题标题】:JSON filtering for multiple keys runs slow多个键的 JSON 过滤运行缓慢
【发布时间】:2020-06-20 09:40:36
【问题描述】:

我的代码可以运行,但运行起来似乎异常缓慢。

我有一组要搜索的值,我有一个要过滤的 JSON

var JSONPull;
var FilterJSON = [];
var TypeIDs = [34,35,36,37,38,39,40,11399,1230,17470,17471,1228,17463,17464,1224,17459,17460,18,17455,17456,1227,17867,17868,20,17452,17453,1226,17448,17449,21,17440,17441,1231,17444,17445,1229,17865,17866,1232,17436,17437,19,17466,17467,1225,17432,17433,1223,17428,17429,22,17425,17426,11396,17869,17870];

fetch('URL API')
    .then(res => res.json())
    .then((out) => {
        JSONPull = out;
        TypeIDs.forEach(function (index){
            FilterJSON = JSONPull.filter((element) => {
                console.log("index: "+index);
                console.log(element);
                console.log("type_id: "+ element.type_id);
                element.type_id === index;
            });
        })
    })

console.logs 更多的是在测试时观看代码,但绝对不应该导致这些性能问题。

您能告诉我有关性能优化的建议吗?

【问题讨论】:

标签: javascript json performance filtering


【解决方案1】:

我意识到我遇到了另一个问题,每次调用 API 限制为 1000 个对象,因此我必须遍历 type_id 以将 API 添加为过滤器,我的代码如下,并且运行良好。感谢大家的帮助。

var mergedJSON = [];
var TypeIDs = [34,35,36,37,38,39,40,11399,1230,17470,17471,1228,17463,17464,1224,17459,17460,18,17455,17456,1227,17867,17868,20,17452,17453,1226,17448,17449,21,17440,17441,1231,17444,17445,1229,17865,17866,1232,17436,17437,19,17466,17467,1225,17432,17433,1223,17428,17429,22,17425,17426,11396,17869,17870];

TypeIDs.forEach(function(index){

fetch(`https://<URL here>&order_type=all&type_id=${index}`)
    .then(res => res.json())
    .then((out) => {
        out.forEach(function (element){
            mergedJSON.push(element);
        })
    })
})

我为非标准的大小写道歉,我一直是一个孤独的编码者,所以只要我的变量不是全部大写,我就可以接受它。我会冒险变得更加标准化。

【讨论】:

    【解决方案2】:

    按照您现在执行此操作的方式,对于您要查找的 ID 数量,每个数据项都有一个完整的循环。我假设您的记录比您要查找的 ID 多得多,因此您应该稍微重构一下,并在此过程中删除整个回调/关闭。依靠一些浏览器优化的代码。

    out.filter(element => TypeIDs.includes(element.type_id))
    

    https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/includes

    另外,作为一个审查点...您的变量大小写是非标准的,因此难以浏览您的代码。 (不是编译器关心...)

    而且,console.log()肯定会导致性能问题。

    【讨论】:

    • 需要注意的是,includes 在 IE 中是 not supported
    • @Zuckerberg 当然,随便提。在这一点上,这对几乎每个人来说都不是问题。 caniuse.com/#feat=array-includes 当您使用它时,还要提一下,如果您仍然针对 7 年前的浏览器,您将使用捆绑器、转译器(用于 ES6 语法)和一堆 polyfill无论如何都要为你处理好这个。
    • @Zuckerberg 你知道 Fetch API 在 IE 11 中也不起作用吗?该问题充分利用了 Fetch API。
    • 这是一个更个人化的项目,我不使用 IE/Edge,除非它是在我个人使用的新计算机上下载另一个浏览器...感谢您的提醒。关于代码,我读对了吗?它应该返回 type_id 在 TypeIDs 数组中的任何对象的返回位置?我已经测试了代码,返回的对象数量似乎很轻
    • @Blackard 所有这些东西都可以在 Edge 中使用,别介意扎克伯格的 cmets。 :-)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-10-08
    • 2016-11-10
    • 1970-01-01
    • 1970-01-01
    • 2016-01-22
    • 2021-06-29
    • 1970-01-01
    相关资源
    最近更新 更多