【发布时间】:2015-07-19 18:04:51
【问题描述】:
预先说明解决方案只需要在最新版本的 Chrome、Firefox 和 Safari 中运行作为奖励。
-
我正在尝试将关联数组用于具有剔除的大型数据集。我的第一次尝试使它成为一个真正的关联数组:
[1: {Object}, 3: {Object},...,n:{Object}]
但淘汰赛对循环播放不满意。于是我尝试了一种作弊方式,希望:
[undefined, {Object}, undefined, {Object},...,{Object}]
数组中的位置是数据库表中的 PK ID。这个数组大约有 3.2k 个项目,大约每 10 秒迭代一次,因此需要速度。我尝试通过拼接来做到这一点,例如
$.each(data, function (index, item) {
self.myArray.splice(item.PKID, 0, new Object(item));
}
但是 splice 不会创建索引,所以由于我的第一个 PKID 是 1,所以无论如何它仍然插入到 myArray[0]。如果我的第一个 PK 是 500,它仍然会从 0 开始。
我的第二个想法是用var myArray = new Array(maxSize) 初始化数组,但这似乎很重。我希望能够使用某种映射函数来执行此操作,但我不确定如何将键值转换为 javascript 中的索引值。
我的第三个想法是保留两个数组,一个用于轻松查找,另一个用于存储实际值。因此,它几乎结合了前两个解决方案,通过在第一个示例中找到对象的索引并在第二个示例中进行查找。这似乎是有多少人在淘汰赛中管理关联数组,但考虑到数组大小以及它是一个具有不断增长的数据集的实时更新应用程序这一事实,似乎内存密集且在新信息出现时不易管理已添加。
另外,也许我在这里打错了?我们通过敲除将它们放入 DOM 并使用一个名为 isotope 的库进行管理,正如我所提到的,它大约每 10 秒更新一次。这就是为什么我需要快速查找但淘汰赛不想玩我的哈希表尝试。
--
清晰度编辑:
所以在初始加载时,整个数组都被加载(这是new Array(maxLength) 所在的位置,然后每 10 秒加载一次已更改的任何内容。这就是我要快速更新的信息。
-- 淘汰码:
<!-- ko foreach: {data: myArray(), afterRender: setInitialTileColor } -->
<div class="tile" data-bind="attr: {id: 'tileID' + $data.PKID()}">
<div class="content">
</div>
</div>
<!-- /ko -->
那么在更新时希望是:
$.each(data.Updated, function (index, item) {
var obj = myModel.myArray()[item.PKID];
//do updates here - need to check what kind of change, how long it's been since a change, etc
}
【问题讨论】:
-
您需要通过PK ID查找物品吗?种类?数字/索引是在前端做任何事情,还是只需要它们从服务器检索数据?
-
首先,您所展示的不是 javascript 数组的有效语法...发布一些实际的 json。不是 100% 清楚你正在使用什么。另外,您是否控制 API 源输出?
-
不,它们只是任意的,不会改变。他们有组织 ID,但只有当我们保持相同的系统并且从不切换时,这些才是重要的。这实际上只是为了快速查找,否则在最坏的情况下会变成每 10 秒 9k 循环,平均 4.5k 循环。
-
but knockout was not happy with looping over that.你是如何尝试用淘汰赛来循环它的?你能应该那个代码吗?也许你的问题就在那里。 -
这里确实有问题。最坏的情况是你可以使用网络工作者来卸载一些处理,但我猜你有一个设计缺陷
标签: javascript jquery arrays performance knockout.js