【问题标题】:Remove sub array item in knockout在淘汰赛中删除子数组项
【发布时间】:2013-01-16 03:38:50
【问题描述】:

从一个可观察数组中删除一个项目的最佳方法是什么,该数组是另一个可观察数组本身的一个项目?让我举个例子(简化)。

假设我有一个可观察的数组“聊天”:

self.chats = ko.observableArray();

这是我的聊天对象:

function chat(id, name, members) {
    this.id = id;
    this.name = name;
    this.members = ko.observableArray(members);
}

这是成员对象:

function member(id, username) {
    this.id = id;
    this.username = username;
}

我想从 chats 数组中删除一个成员,但我只知道一个成员的 id,而且我对它所属的聊天一无所知。有没有比遍历所有 chat 项目(使用 ko.utils.arrayForEach)和所有 member 项目并检查 id 更好的方法?

【问题讨论】:

  • 会员可以多于一个聊天吗?
  • 没有特定成员只能在一个聊天中。

标签: javascript knockout.js


【解决方案1】:

您可以使用映射将成员 ID 映射到他们所在的任何聊天。IE:

var memberMap = {};
...
//on add
if(!(memberId in memberMap){
    memberMap[memberId] = [chatRef]
}
else{
    memberMap[memberId].push(chatRef);
}

然后您将缓存对聊天对象的引用,以便您可以直接搜索这些成员列表。

更新

由于显然存在 1-1 成员聊天关系,因此成员映射代码可以看起来像这样

var memberMap = {};
...
//on add
    memberMap[memberId] = chatRef;

【讨论】:

    【解决方案2】:

    当然,我对knockout.js 不太熟悉,但是您是否可以为成员类添加一个名为'chat' 的新属性?

    基本上,每次成员以某种方式与聊天关联时,您都会使用聊天 ID 更新该属性,以便在执行需要来自聊天和成员的属性的操作时更轻松地链接两者对象。

    如果你愿意,可以通过在构造函数中将它声明为一个变量来将聊天变成一个私有的“属性”;这样,您只能通过您编写的任何 getter/setter 方法引用“聊天”。

    【讨论】:

    • 他说他只有一个成员的 id,而不是对它的引用,所以这个解决方案还需要一个 id 到引用的映射。
    • 好点。出于某种原因,我假设他已经维护了一个包含所有成员的单独地图。
    猜你喜欢
    • 1970-01-01
    • 2019-05-16
    • 2013-04-10
    • 2014-09-30
    • 2013-11-01
    • 2016-05-27
    • 2013-04-24
    • 2013-06-02
    • 2014-11-12
    相关资源
    最近更新 更多