如何在JavaScript原型中将对象推入数组?

4
我有一个Angular Factory,它的工作是保存特殊对象并在以后检索它们。 (用于保存用户在切换视图时的工作流程)。
基本上,我需要保存带有名称的对象,以及标签数组。 我的问题是将标签保存到数组中的部分。
原型构造函数:
// define the TagsObject constructor function
var TagsObject = function(name, tag) {
    this.name = name;
    this.tags = [].push(tag);
    return this;
};

完整的工厂代码:

.factory('TagFactory', [function() {

    // Init TagFactory:
    var tagContainers = [];

    // define the TagsObject constructor function
    var TagsObject = function(name, tag) {
        this.name = name;
        this.tags = [].push(tag);
        return this;
    };

    console.log('tagFactory');
    console.log(TagsObject);

    var saveTags = function(name, tag) {

        tagContainers.push(new TagsObject(name, tag));

        console.log('saveTags:');
        console.log(tagContainers);
    };

    var getTags = function(name) {
        console.log(name);
        return this;
    };

    return {
        saveTags : saveTags,
        getTags  : getTags
    };
}]);

在另一个控制器中,我现在将一些数据保存到TagFactory内的新原型中:

TagFactory.saveTags('TEST', tagObj);

现在回到我的工厂,在你看到console.log(nameTagContainers);的地方,以下是日志:

[TagsObject]
    0: TagsObject
    tags: 1
    name: "TEST"
    __proto__: TagsObject
    length: 1
    __proto__: Array[0]

^标签是一个数组,但它显示的是1,而不是对象的详细信息...你看到我哪里错了吗?



更新:这个问题已经被Kauê Gimenes回答了,但我分享了额外的代码来解决我的另一个问题。

每当为当前选择的名称选择新标签时,它都会生成一个新的原型,而不是将标签保存到现有的原型中:

var saveTags = function(name, tag) {

    console.log(tagContainers.length);

    if (tagContainers.length != 0) {
        for(var i = 0; i < tagContainers.length; i++) {
            if (tagContainers[i].name == name) {
                console.log('Found existing name! Add tag to existing obj');
                tagContainers[i].tags.push(tag);
                break;
            } else {
                console.log('New name, create new obj');
                tagContainers.push(new TagsObject(name, tag));
            }
        }
    }
    else {
        console.log('New name, init: create the first obj');
        tagContainers.push(new TagsObject(name, tag));
    }

    console.log(' ');
    console.log('tagContainers:');
    console.log(tagContainers);
};
1个回答

2

尝试这种方法:

// define the TagsObject constructor function
var TagsObject = function(name, tag) {
    this.name = name;
    this.tags = [tag];
    return this;
};

初始化数组的最佳方法是在方括号内包含元素。

[ 1 , 2 , 3 ]

但如果您想使用n个元素进行初始化,则可以使用concat函数。

[ 1 ].concat([ 2 , 3 , 4 ])

结果将会是:
[ 1 , 2 , 3 , 4 ]

啊,是的,那确实可以运行,并回答了这个问题...但我刚刚意识到我写错了这段代码。现在用户可以为一个名称选择多个标签。目前我的代码每次用户为同一名称点击新标签时都会创建一个新原型。谢谢!我需要更新我的代码,可能还要发布一个新问题。 - Leon Gaban
1
我包含了一些额外的信息来使答案更清晰,如果你仍然有任何关于此的问题,请随时问! - Kauê Gimenes
啊,好的,那么这个包含 n 个元素的数组可以解决我在这里遇到的新问题。 - Leon Gaban
1
太好了!我很高兴能够解决你的问题 =) - Kauê Gimenes

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接