1

これは私のコードの簡単な要約です:

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 関数の場合) が、常に脱退および参加するグループがあるため、変数に配列スロットを指定できません。

基本的に、ある変数を編集して別の変数を変更する方法はありますか?

4

2 に答える 2

2

このようなものはどうですか?:

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グループと古い名前が記憶されます。groupmemberNamechangeName

答えを絞り込むために、leaveGroup()メソッドを省略しましたが、返されたオブジェクトに別の関数として追加できます。また、グループ全体が削除された場合にどうなるかについても触れていませんが、それはアプリにとって何が意味があるかによって異なります。

元のサンプルからのいくつかの単純化:

  1. list1 つしか含まれていないように見える最上位の var を平坦化しましたgroup
  2. 各グループを単純化して、ハッシュではなく名前の配列にし ['billy', 'bob']ました{ name1: 'billy', name2: 'bob' }

これが役立つことを願っています。

于 2013-02-13T19:19:19.953 に答える
1

関数で参照する変数にオブジェクトを格納できます。

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;
    }
}
于 2013-02-13T03:44:31.833 に答える