预先考虑一个解决方案只需要在最新版本的 Chrome、Firefox 和 Safari 中工作作为奖励。
-
我正在尝试对具有 knockout 功能的大型数据集使用关联数组。我的第一次尝试使它成为真正的关联数组:
[1: {Object}, 3: {Object},...,n:{Object}]
但是 knockout 对循环播放它并不满意。所以我尝试了一种作弊方式,希望:
[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 中的索引值。
我的第三个想法是保留两个数组,一个便于查找,另一个用于存储实际值。所以它结合了前两个解决方案,几乎是通过在第一个示例中找到对象的索引并在第二个示例中进行查找。这似乎是有多少人在 knockout 中管理关联数组,但是考虑到数组大小以及它是一个具有不断增长的数据集的实时更新应用程序这一事实似乎占用大量内存并且在新信息出现时不容易管理添加。
此外,也许我在这里打错了标记?我们通过一个名为 isotope 的库通过 knockout 和管理将它们放入 DOM,正如我提到的,它大约每 10 秒更新一次。这就是为什么我需要快速查找但 knockout 不想玩我的哈希表尝试。
--
清晰度编辑:
所以在初始加载时整个数组被加载(这是 new Array(maxLength)
会去的地方,然后每 10 秒加载任何改变的东西。这就是我正在尝试的信息快速更新。
-- knockout 代码:
<!-- 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
}
最佳答案
这是一个如何用正确的索引填充数组项的解决方案,因此它不会从第一个开始(我的意思是 0(零))
只在循环中使用
arr[obj.PKID] = obj;
如果你的框架很聪明(使用 forEach 而不是 for),它将从你的索引开始(比如下面的 500)
var data = [], new_data = [];
// Generate sample array of objects with index field
for (var i = 500; i < 3700; i++) {
data.push({
PKID: i,
value: '1'
});
}
data.forEach(function(item) {
new_data[item.PKID] = item;
});
console.log(new_data);
console.log(new_data.length); // 3700 but real length is 3200 other items are undefined
关于javascript - 有没有办法将对象中的值映射到 javascript 中的数组索引?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30130330/