Javascript JS:join()-ing一个对象数组

Javascript JS:join()-ing一个对象数组,javascript,Javascript,假设我有一个对象数组,有时我希望能够以散列形式访问这些对象(改变它们的值,嗯?),有时还希望打印它们 var test = { members : [] }; test.addMember = function(name, value) { this.members[name] = { name : name, value : value }; this.members[name].toString = function() { return this.na

假设我有一个对象数组,有时我希望能够以散列形式访问这些对象(改变它们的值,嗯?),有时还希望打印它们

var test = { members : [] };
test.addMember = function(name, value) { 
    this.members[name] = { name : name, value : value }; 
    this.members[name].toString = function() { 
        return this.name + " has a " + this.value; };
};
test.toString = function() { 
    return this.members.join(" and ");
};
test.addMember("a", "a value");
test.addMember("b", "b value");
alert(test);
我的目标是让test.toString()返回:

或者你做了什么。我在读MDN,JavaScript 1.8.5(或某些子版本)将有一个调用toString()的join()。我卡住了吗

谢谢

编辑:这是我的最终设计,包括修改和删除功能(以防有人好奇)

var测试={
成员:[],
modifyMember:函数(名称、值){
var index=this.members.indexOf(this.members[name]);
如果(指数<0){
返回;
}
this.members[index].value=this.members[name].value=value;
},
addMember:函数(名称、值){
如果(this.members[name]){
此.modifyMember(名称、值);
返回;
}
this.members[name]={
姓名:姓名,,
价值:价值,
toString:function(){
返回this.name+“has”+this.value;
},
}; 
this.members.push(this.members[名称]);
},
removeMember:函数(名称){
如果(!this.members[name])返回;
this.members.splice(this.members.indexOf(this.members[name]),1);
删除此项。成员[姓名];
},
toString:function(){
返回此。成员。加入(“和”);
} 
};

您已经在使用属性扩展阵列。现在,别忘了填充数组。使用
Array.push()

一种方法是:(成员是对象)

另一种方式(成员是数组):


或者更确切地说,a有一个a值,b有一个b值。。。对这正是我的意思。我喜欢斯图和吉利的答案。Stewe需要更多的处理,gilly3需要更多的内存使用。我已经决定使用gilly3,但我想感谢大家这么快的回答。感谢您将我的第一个问题发布到stackoverflow,这将使我再次返回!干杯+1@mpw:就是这样。只需将对象推到阵列中。否则您将丢失它们。您应该避免完全添加expando,更好的解决方案是直接添加对象,并以不同的方式处理重复项。因此,添加键控值允许我(当然)键控访问,但会中断join()。将对象推到数组上会破坏我通过键访问的能力(尽管我可以创建一个方法来伪造它),但允许加入。但这两种方法似乎都会破坏迭代,我更愿意避免这种情况。@mpw-它不会“破坏”联接。这些“键控值”实际上是数组上的属性,而不是集合的一部分。Join工作正常-您的数组为空,因此返回了一个空字符串。如果您在中通过对..进行迭代,我建议您不要这样做。只需使用或常规的
for
循环迭代数组即可。迭代不应该中断。@gilly3-当我键入break时,我的意思是为了我的目的。我认为我所认为的“键值数组”只是一个“带属性的数组”。join()不包含函数或属性,如果包含,它将是一个不太有用的函数。我认为真正的最佳解决方案取决于我是通过其name属性访问特定的test.member,还是通过字符串打印它。我认为通过名称访问(成员是一个数组)需要最多N个循环才能找到我的值,而通过创建临时数组进行字符串访问总是需要N个循环。阵列的想法看起来确实更有效!
a has a value and b has b value
var test = { 
    members : [],
    modifyMember : function(name, value) {
        var index = this.members.indexOf(this.members[name]);
        if(index < 0) {
            return;
        }
        this.members[index].value = this.members[name].value = value;
    },
    addMember : function(name, value) { 
        if(this.members[name]) { 
            this.modifyMember(name, value);
            return;
        }
        this.members[name] = { 
            name : name, 
            value : value,
            toString : function() { 
                return this.name + " has " + this.value; 
            },
        }; 
        this.members.push(this.members[name]);
    },
    removeMember : function(name) { 
        if(!this.members[name]) return;
        this.members.splice(this.members.indexOf(this.members[name]), 1);
        delete this.members[name];
    },
    toString : function() {
        return this.members.join(" AND ");
    } 
};
test.addMember = function(name, value) { 
    this.members[name] = { name : name, value : value }; 
    this.members.push(this.members[name]);
    ...
};
var test = { members : {} };
test.addMember = function(name, value) { 
    this.members[name] = { name : name, value : value }; 
    this.members[name].toString = function() { 
        return this.name + " has a " + this.value; };
};
test.toString = function() {
    var arr=[];
    for(var i in this.members) {
        if (this.members.hasOwnProperty(i)){
            arr.push(this.members[i].toString());
        }
    }
    return arr.join(" and ");
};
test.addMember("a", "a value");
test.addMember("b", "b value");
alert(test.toString());
var test = { members : [] };
test.addMember = function(name, value) { 
    var arr= { name : name, value : value }; 
    arr.toString = function() { 
        return this.name + " has a " + this.value; 
    };
    this.members.push(arr);
};
test.toString = function() { 
    return this.members.join(" and ");
};
test.addMember("a", "a value");
test.addMember("b", "b value");
alert(test.toString());