如何将对象推入 JavaScript 原型中的数组?
How to push objects into array inside of a JavaScript Prototype?
我有一个 Angular 工厂,其工作是保存特殊对象并在以后检索它们。
(用于在用户切换视图时保存用户工作流程)。
基本上我需要用一个名字和一组标签来保存对象。我的问题是将标签保存到数组部分。
原型构造函数:
// 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 内部的 new Prototype
中:
TagFactory.saveTags('TEST', tagObj);
现在回到我的工厂,您会看到 console.log(nameTagContainers);
以下是日志:
[TagsObject]
0: TagsObject
tags: 1
name: "TEST"
__proto__: TagsObject
length: 1
__proto__: Array[0]
^ tags 是一个数组,但它显示的是 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);
};
试试这个方法:
// 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 ]
我有一个 Angular 工厂,其工作是保存特殊对象并在以后检索它们。
(用于在用户切换视图时保存用户工作流程)。
基本上我需要用一个名字和一组标签来保存对象。我的问题是将标签保存到数组部分。
原型构造函数:
// 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 内部的 new Prototype
中:
TagFactory.saveTags('TEST', tagObj);
现在回到我的工厂,您会看到 console.log(nameTagContainers);
以下是日志:
[TagsObject]
0: TagsObject
tags: 1
name: "TEST"
__proto__: TagsObject
length: 1
__proto__: Array[0]
^ tags 是一个数组,但它显示的是 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);
};
试试这个方法:
// 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 ]