簡體   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