5

我正在尝试通过循环为数组中的每个项目创建一个新对象。对象的名称应基于数组的键。

所以对于这个数组:

var arr = new Array(
    "some value",
    "some other value",
    "a third value"
);

将产生三个对象:

alert(object1.value);
alert(object2.value);
alert(object3.value);

到目前为止我的代码(但不工作)是:

// Object
function fooBar(value) {
    this.value = value;
    ...
}

// Loop
var len = arr.length;
for (var i = 0; i < len; i++) {
    var objectName = object + i;
    var objectName = new fooBar(arr[i]);
}

我所要求的是否有意义?

4

4 回答 4

9

您还必须制作一个对象数组

var objs = new Array();

for(var i = 0; i < len; i++) {
  objs[i] = new fooBar(arr[i]);
}

alert(objs[0].value);
于 2013-01-05T23:32:38.350 回答
5

您可以映射您的数组:

var arr = new Array(
    "some value",
    "some other value",
    "a third value"
);
var fooBars = arr.map(function(x) { return new fooBar(x); });

然后您可以访问每个值:

alert(fooBars[0].value);
// etc.

或一次处理它们:

fooBars.forEach(function (foo) { alert(foo.value); });
于 2013-01-05T23:44:13.390 回答
4

您要求的内容是有道理的,但不应该是您构建 JavaScript 的方式。

从技术上讲,有一种方法可以使用您动态构建的名称创建变量,但您不应该使用它,因为它很慢,而且如果用户指定数组中的内容,它是不安全的,并且几年后需要该功能,所以你的旧东西可能会在未来的浏览器中损坏。

同时,您可以轻松地执行以下操作:

var obj = {},
    arr = [ "one", "two", "three" ],

    i = 0,
    len = arr.length,
    val = "",
    name = "";

for (; i < len; i += 1) {
    name = "item" + i;
    val = arr[i];
    obj[name] = val;
}

现在你可以打电话obj.item1; // "two"

如果你真的很绝望,你可以在全局范围内写东西时使用windowas objso,你可以直接写item0; // "one",但这确实不是一个好主意,有几个原因(可读性、可维护性、覆盖别人的可能性)属性等)。

于 2013-01-05T23:44:00.950 回答
3

如果你真的想要这样命名的变量,这里有一个解决方案

function fooBar(value) {
    this.value = value;
}

var arr = new Array(
    "some value",
    "some other value",
    "a third value"
);

(function(context) {
    for ( var i = 0; i < arr.length; i++) {
       var key = 'object' + ( i + 1 );
       this[ key ] = new fooBar( arr[ i ] );
     }
}(window));

alert(object1.value);
alert(object2.value);
alert(object3.value);

如果您不想要全局变量object1......只需将关键字替换为windowthis它将生成当前范围的局部变量。

在这里测试一下:http: //jsfiddle.net/bukart/F8ham/1/

于 2013-01-05T23:45:15.093 回答