繁体   English   中英

有没有一种方法可以将对象中的值映射到javascript中数组的索引?

[英]Is there a way to map a value in an object to the index of an array in javascript?

前提条件是,解决方案只需要在最新版本的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));
}

但是拼接不会创建索引,因此由于我的第一个PKID为1,因此无论如何它仍将插入myArray[0] 如果我的第一个PK是500,那么它将仍然从0开始。

我的第二个想法是使用var myArray = new Array(maxSize)初始化数组,但这似乎很var myArray = new Array(maxSize) 我希望能够使用某种map函数来执行此操作,但是我不确定如何在javascript中将键值转换为索引值。

我的第三个想法是保留两个数组,一个数组易于查找,另一个数组存储实际值。 因此,它几乎通过在第一个示例中找到对象的索引并在第二个示例中进行查找来结合前两个解决方案。 似乎是有多少人在淘汰赛中管理关联阵列,但是阵列的大小以及它是具有不断增长的数据集的实时更新应用程序这一事实似乎占用大量内存,并且在添加新信息时不容易管理。

另外,也许我在这里打错了标记? 我们通过剔除并将它们放入DOM中,并使用称为同位素的库进行管理,正如我提到的,它大约每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
}

这是一个如何使用正确的索引填充数组项的解决方案,因此它不是从第一个(我是指0(零))开始的

只是循环使用

arr[obj.PKID] = obj;

并且如果您的框架很聪明(可以使用forEach而不是forEach),它将从您的索引开始(例如下面的情况为500)

http://jsfiddle.net/0axo9Lgp/

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

这不是一个容易解决的问题。 我假设您已经尝试(或无法尝试)明显的东西,例如减少每页的项目数,并且可能使用了类似React或Mithril的框架。

我可以建议一些基本的优化。

  1. 不要使用框架的每个框架。 它比本机Array方法forEach慢或与之相同,或者比基本的for循环慢。
  2. 不要一遍又一遍地遍历数组,寻找数据已更新的每个项目。 当您发送数据更新响应时,请发送更新项的PKIds数组。 然后,执行一个循环:

var indexes = []
var updated = JSON.parse(response).updated; // example array of updated pkids.
for(var i=0;i<allElements.length;i++){
    if(updated.indexOf(allElements[i].pkid)>-1)
        indexes.push(i);
}

因此,基本上以上假设您有一个简单的对象数组,其中每个对象都有一个称为pkid的属性,用于存储其ID。 得到响应后,您将循环遍历此数组一次 ,将与pk-id匹配的所有项目的索引存储在更新的pk-id数组中。

然后你只需要遍历所有的indexes数组,并使用其元素的索引上allElements数组,可以直接更新。

如果索引是合理范围内的整数,则可以使用数组。 它不必完全填充,您可以使用if绑定来过滤出未使用的条目。

应用更新只是索引数组的问题。

http://jsfiddle.net/0axo9Lgp/2/

您可能要考虑使用发布-订阅模式。 让每个项目都订阅其唯一的ID。 当项目需要更新时,它将获取事件并自行更新。 该库可能对此有所帮助。 它不依赖于浏览器事件,而仅依赖于数组,因此它应该相当快。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM