3

在我的應用程序中,我有一個ItemsService,它從服務器獲取項目,並將它們作爲JSON對象存儲在其cache變量中。項目可以存在於許多地方,例如在表格或圖表/圖表等等。如何實現兩個數組之間的雙向連接?

例如,當我初始化一個table時 - 我只需要從cache中僅選取特定項目,例如,第一,第三,第七。

如何實現它們之間的雙向連接?基本上我想要table包含對cache中特定項目的引用,所以當我更改cachetable中的某個項目時 - 它的狀態將始終保持同步,因爲它的狀態是項目相同。

此外,當我從table刪除項目 - 它需要從cache刪除。 Relationship between cache and table

這裏的示例和tablecache結構:

表:

table: { 
    "36": { // it's a name of a row 
     "72": [items], // it's a name of a column with corresponding items 
     "73": [items], 
     "74": [items] 
    }, 

    "37": { 
     "72": [], 
     "73": [items], 
     "74": [items] 
    }, 
    "38": { 
     "72": [], 
     "73": [], 
     "74": [] 
    } 
} 

ItemsService緩存(簡化版本):

ItemsService = { 
    cache: [items] 
}; 

項目結構:

{ 
    id: 3, 
    parent_id: 1, 
    name: 'First Item', 
    siblings: [1,2,3], 
    active_users: [{user_id: 1, avatar_url: 'http://...'}, ...], 
    // 50 more fields :) 
} 

另外需要指出的是,我使用angular-ui-sortable插件允許在列/行之間拖動項目,我需要提供ng-model與數組(我認爲)。以下是它現在的樣子:

<td ui-sortable="vm.sortableOptions" 
    ng-model="vm.table[row.id][column.id]"> 
    <sb-item itemid={{item.id}} 
      ng-repeat="item in vm.table[row.id][column.id]"> 
    </sb-item> 
</td> 
+0

你應該向我們展示兩個數組的結構,因爲有很多方法可以做到這一點,這取決於它們的結構。 – Buzinas

+0

我提供了結構 – yaru

+0

'items'結構是最重要的。 – Buzinas

回答

1

除非出於某種原因,你必須使用兩個獨立的陣列,有你使用filter考慮?

+0

我沒有考慮使用過濾器。需要考慮這種方法... – yaru

1

你最好的選擇是對象。在javascript中保存對象的變量並不是真正擁有對象,而是對所述對象的引用。當您將該變量傳遞給另一個變量時,參考值將被複制,這樣兩個變量都指向同一個對象。

var a = { 0: 'Property 0' }; 
var b = a; 
b[0] = 'Property 0!'; //a[0] also the same. 
delete b[0]; //a[0] nor b[0] exist anymore. 
0

使用對象(而不是JSON)會起作用。

然後你的緩存和你的表都指向相同的項目對象。如果你改變對象中的某些東西,它會反映在兩端。

var cacheArray = [{ item: 1 }, { item: 2}]; 
table[0][0] = cacheArray[0]; 
console.log(table[0][0].item); // 1 
cacheArray[0].item = 9; 
console.log(table[0][0].item); // 9. 

請注意,數組和表格沒有改變。他們仍然指向相同的對象。