【问题标题】:Optimizing my search query through many objects通过许多对象优化我的搜索查询
【发布时间】:2017-08-14 19:02:31
【问题描述】:

下面的代码片段,它的作用是搜索大约 100 个对象并检查我的查询是否与条目的标题匹配,一次一个字符。 输入任何字母时,它会冻结浏览器大约 5 秒钟,然后重新获得控制权。

片段:

results = _.filter(cmp.get('v.components'), function(item) {
            return item.componentName.toLowerCase().indexOf(queryResult) != -1;
        });

作为 Javascript 的新手,我在编写这段代码时已经遇到了一些问题,所以我对如何改进这一点有点不了解。我准备了一段代码,因此它会在获得结果后将其删除之前显示加载屏幕,但由于浏览器冻结,它不会显示任何内容。

顺便说一句,我们仅限于使用 Javascript 和 underscore.js,因此我们无法访问 jQuery 或其他库。

【问题讨论】:

  • 以这种方式过滤仅 100 个对象不会导致任何明显的延迟。 cmp.get('v.components') 到底是做什么的?
  • 我们使用 Salesforce 的 Lightning 作为框架,与组件、控制器和助手一起工作。它的作用是从组件脚本中获取对象并将其拉入帮助脚本
  • 也许将cmp.get('v.components') 分配给上一行的一个变量,然后单步执行代码。这样你至少可以看到延迟是cmp.get还是_filter
  • 啊,是的,马上试试!

标签: javascript object search underscore.js


【解决方案1】:

你可以从下划线切换到纯js,它应该接近下划线的两倍。此外,它不是更多的代码。我创建了一个非常简单的基本测试here

js 版本看起来像

data.filter(item => item.componentName.toLowerCase().indexOf(queryResult) > -1);

或者它的 es5 等价物

data.filter(function(item) { return item.componentName.toLowerCase().indexOf(queryResult) > -1; });

对于其余部分,您需要检查调用 cmp.get('v.components') 时可能存在的瓶颈

【讨论】:

  • 在脚本中添加了一些console.log后,我认为获取数据不是问题,但您的经典方法确实进一步提高了他的速度。问题似乎出在图形方面。对于每个结果,它都会加载一张卡片,上面有一些设置,因此用户可以轻松地搜索可配置的选项。所以我需要找到一种方法来限制它加载的卡片数量,因为一次加载所有 100 张卡片似乎很麻烦。
  • 是的,肯定是这样。也许看看像无限滚动然后@drVagax
猜你喜欢
  • 2018-02-23
  • 1970-01-01
  • 2013-03-16
  • 2016-01-06
  • 2021-08-23
  • 1970-01-01
  • 2011-12-31
相关资源
最近更新 更多