链接variables

这是我的代码的一个简单的总结:

var list = { "group":{ "subgroup1":[{"name1":"Jimmy","name2":"Bob"}], "subgroup2":[{"name1":"Sarah","name2":"Nick"},{"name1":"Kevin","name2":"George"}] } } function group(group,name){ var linktothegroup; //Note: In my actual code it will attempt to join a group before creating one this just creates a new one //group: Specifies which subgroup to join (my actual code will check if it's valid this is just a simpler version //name: the users name list["group"][group].push({"name1":name,"name2":""}); linktothegroup = someway to link that group I just added; //I figured I could find the array slot and specify but that will change if a group is deleted this.leavegroup = function(){ //leaves the group //uses the linktothegroup var to be removed from the group } this.changename = function(name){ linktothegroup.name1 = name; return true; } } var cubscouts = new group("subgroup1","Billy"); cubscouts.changename("Fred"); 

我只是想能够编辑“subgroupX”字段中的值(基本上为changename函数),但是有一些组离开和join所有的时间,所以我不能指定variables中的数组槽。

所以基本上有办法编辑一个variables,并有另一个variables呢?

这样的事情怎么样?

 var groups = { joinGroup: function(groupName, memberName) { if(!this[groupName]) { // create the group if it doesn't exist this[groupName] = [] // each group is just an array of names } var group = this[groupName] group.push(memberName) // returns an object allowing for the member's name to be changed later return { // this function becomes a closure, so the group and memberName variables // retain their values from the enclosing scope changeName: function(newMemberName) { group.splice(group.indexOf(memberName), 1, newMemberName) } } } } 

这允许这种用法:

 myCubscoutMembership = groups.joinGroup('cubscouts', 'Billy') myCubscoutMembership.changeName('Bob') 

谜题的关键部分(如果我正确理解你的问题)是changeName函数作为一个闭包围changeNamememberNamevariables返回 – 所以即使在changeName调用changeName时,也会记住正确的组和旧名称。

为了保持答案的重点,我省略了leaveGroup()方法,但是可以将其作为另一个函数添加到返回的对象中。 我也没有解决如果整个组被删除会发生什么,但这取决于你的应用程序的意义。

从你的原始样本中简单几个:

  1. 我压扁了似乎只包含一个group的顶级list var。
  2. 我把每个组简化为一个名称数组而不是散列,即['billy', 'bob']而不是{ name1: 'billy', name2: 'bob' }

希望有些帮助。

您可以将该对象存储在您在函数中引用的variables中。

 function group(group,name){ //other work here var linktothegroup = {"name1":name,"name2":""}; list["group"][group].push(linktothegroup); this.leavegroup = function(){ var groups = list["group"][group]; for(var i = 0; i < groups.length; i++) { if(groups[i] === linktothegroup) { groups.splice(i, 1); break; } } } this.changename = function(name){ linktothegroup.name1 = name; return true; } }