如何实现两个数组之间的双向连接?

时间:2015-09-27 13:57:24

标签: javascript angularjs jquery-ui-sortable angular-ui-sortable

在我的应用程序中,我有一个ItemsService,它从服务器获取项目,并将它们作为JSON对象存储在其cache变量中。物品可以存在于许多地方,例如在表格或图表/图表等。

例如,当我初始化table时 - 我只需从cache中选择特定的项目,例如1日,3日,7日。

如何实现它们之间的双向连接?基本上我希望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>

3 个答案:

答案 0 :(得分: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.

答案 1 :(得分:1)

除非出于某种原因你必须使用两个单独的数组,否则考虑使用filter

答案 2 :(得分: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.  

请注意,数组和表格没有变化。他们仍然指向相同的对象。