0

我打算把这篇写得又长又复杂,但我想采用直截了当的方法。

我有一个循环,它创建一个元素数组,其中变量Url。数组如下所示:

 x = [url,function(){...},function(){...}];

然后进入一个arrayList:

 arrayList = [x1,x2,x3,x4,x5];

我认为到目前为止这是有道理的。它在 arrayList 对象中存储 1 个 var 和 2 个函数。

这是踢球者。

当我遍历arrayList 时,url都是一样的,是创建arraylist 的forloop 中对url的最后引用。

我解决这个问题的尝试是,对变量执行 .toString() 以将其内容存储在数组中,而不是变量名本身。 那没用:(

我会怎么做才能解决这个问题?我很难过:-(

编辑:我想展示循环的样子,因为其中一个答案是关于数组不准确地引用它

Edit2:导致问题的 url 是内部 url,在下面的 displayFile 中。似乎这些都指向同一个参考,这是一个诺诺。我将如何改变这些?我必须将它作为参数传递吗???

var newArray = new Array();
for(var i=0;i<fileUrls.length;++i) {
   var url = fileUrls[i];
   var x = [];//new Array();
   x = [url,
    function(){
       displayFile(url, 'image', null, ft_id, null, null, null, null, !MA.isiOS());
    }, 
    function(e){
    if(DEBUG) console.log('Error creating gallery thumbnail');
    alert('There was a problem creating a thumbnail');
    MA.hideMessage();
    }
];
newArray.push(x);
}
4

1 回答 1

2

我认为你拥有的是:

arrayList = [x,x,x,x,x];

即包含对同一对象的多个引用的数组。如果是这种情况,那么当您查看url不同项目中的属性时,您一直在查看同一个属性,因为它一遍又一遍地是同一个项目。

这将是重用数组来填充arrayList数组的结果,例如:

var x = [];
var arrayList = [];
for (int i = 0; i < 5; i++) {
  x[0] = 'url ' + i;
  x[1] = function(){};
  x[2] = function(){};
  arrayList.push(x);
}

解决方案是在每次迭代中创建一个新数组:

var arrayList = [];
for (int i = 0; i < 5; i++) {
  var x = [];
  x[0] = 'url ' + i;
  x[1] = function(){};
  x[2] = function(){};
  arrayList.push(x);
}

编辑:

要使调用中url使用的变量特定于每次迭代,您需要一个闭包来捕获该值:displayFile

var newArray = new Array();
for(var i=0;i<fileUrls.length;++i) {
  var url = fileUrls[i];
  var x = [];//new Array();

  var f;
  (function(url){
    f = function(){
      displayFile(url, 'image', null, ft_id, null, null, null, null, !MA.isiOS());
    };
  })(url);

  x = [url, f , 
    function(e){
      if(DEBUG) console.log('Error creating gallery thumbnail');
      alert('There was a problem creating a thumbnail');
      MA.hideMessage();
    }
  ];
  newArray.push(x);
}
于 2012-09-27T20:16:02.280 回答