我是Javascript的新手。任何有关以下问题的帮助或建议都非常感谢。
我想创建一个inturns包含对象列表的数组。鉴于以下代码总结了我的问题
{
var Instrument = {};
var InstrumentArray = new Array;
var array = new Array;
array[0] ="XYZ0";
array[1] ="XYZ1";
.
.
.
array[n] ="XYZn" ;
data1['Name'] = "X";
data1['TypeString'] = "WatchList";
data1['FileTypeString'] = "XLS";
for (var i = 0; i < array.length; i++) {
Instrument['Symbol'] = array[i];
InstrumentArray.push(Instrument);
}
for(var j =0; j< InstrumentArray.length;j++)
{
console.log(InstrumentArray[j]);
}
}
当我通过console.log查看输出时,它会显示正确数量的值,但是 符号:它显示的值是我在这种情况下输入的最后一个“XYZn”。
我知道最后一个值会覆盖符号对象,但无论如何我都可以获取存储的所有值。
先谢谢
答案 0 :(得分:4)
这是因为数组InstrumentArray
中的每个元素都是对同一个对象Instrument
的引用,并且您不断更改该对象的属性。您的代码中有许多需要改进的地方,但简短的回答是在循环中创建Instrument
。
答案 1 :(得分:1)
在您的代码中:
var Instrument = {};
var InstrumentArray = new Array;
虽然在使用new
调用构造函数时可以省略形式参数列表,但这不是一个好主意,因为它可能被误解为Array的赋值而不是Array的新实例。在任何情况下,数组文字可能是更好的选择(明确,更少键入):
var InstrumentArray = [];
同样的:
var array = ["XYZ0", "XYZ1", ... "XYZn"]
以下内容:
data1['Name'] = "X";
data1['TypeString'] = "WatchList";
data1['FileTypeString'] = "XLS";
data1
尚未声明或初始化,可能是一个对象(不要混合单引号和双引号,除非它们是嵌套的,这会使代码混乱)所以字面意思可能更好(原因与以上):
var data1 = {'Name': 'X', 'TypeString': 'WatchList', 'FileTypeString': 'XLS'};
输入的次数要少得多。
for (var i = 0; i < array.length; i++) {
Instrument['Symbol'] = array[i];
InstrumentArray.push(Instrument);
}
其他人告诉你这里发生了什么,可能不是你想要的。请注意,如果属性名称符合有效标识符的rues,则可以使用点表示法(这样更方便):
Instrument.Symbol = array[i];
此外,由于您使用计数器将成员添加到空数组,因此您还可以执行以下操作:
InstrumentArray[i] = Instrument;
但当然他们不会解决你的问题,他们只是做同样的事情(更好?)。