2015-07-08 2 views
1

У меня 2 для петель создания объекта:Для петли, создавая бесконечные дерево объектов

function newImage(){ 
    image = {}; 
    var temp = {} 
    for(i=0;i!=250;i++){ 
     temp[i] = {}; 
    } 
    image = temp; 
    for(i=0;i!=250;i++){ 
     image[i] = temp; 
    } 
} 

Это должно создать объект с 250 значений, каждый из которых является объектом, который содержит 250 объектов. Тем не менее, он создает объект, который создает 250 значений, заполняет те, которые имеют 250 значений, и накладывает это на некоторое время. Я не нашел конца дерева, но он не замирает, заставляя меня поверить в то, что он конечен. Я проверил итерации до 50, и он работает полностью (это не делает длинное дерево). Кажется, что это происходит во время последних итераций. Here's the full thing.

+1

Hm странно. Он должен останавливаться на 'i = 250'. Но, может быть, «я» меняется в другом месте, и он пробирается мимо 250? Часто, чтобы быть в безопасности, люди записывают условие цикла как 'i <250'. – ryanyuyu

+0

О, хорошо. Я сделал это, но это было очень рано. Но это не проблема. Он делает это правильно, но делает это некорректно бесконечно ._ – Fuzzyzilla

+0

Похож, что 'var temp = {}' отсутствует ';' – asimes

ответ

1
var temp = {} 
for(i=0;i!=250;i++){ 
    temp[i] = {}; 
} 

Линии выше создать объект и заполнить его с 250 другими объектами (до сих пор так хорошо).

Затем image = temp; устанавливает (глобальные) переменные изображения, чтобы быть temp (так как теперь образ содержит 250 объектов), то:

for(i=0;i!=250;i++){ 
    image[i] = temp; 
} 

Это заменяет каждый из этих 250 объектов (перезапись предыдущих заданий) со ссылкой на родительский объект, поэтому объект имеет 250 атрибутов, которые все относятся к самому себе.

Эффективно то, что вы написали:

image = {}; 
for (var i = 0; i < 250; i++) 
    image[i] = image; 

Затем оказывается, что у вас есть бесконечное дерево объектов, тогда как у вас есть только один объект, который имеет множество атрибутов, которые относятся к себе так, когда вы спускаетесь к ребенку вы возвращаетесь назад к родительскому объекту (и расширение иерархии объектов в браузере делает его казанным бесконечным деревом, когда оно на самом деле только показывает один и тот же объект снова и снова).

То, что вы, вероятно, имел в виду, чтобы написать это:

function newImage(){ 
    var temp = {}; 
    for(var i=0; i < 250; i++){ 
     temp[i] = {}; 
     for(var j=0; j<250; j++){ 
      temp[i][j] = {}; 
     } 
    } 
    return temp; 
} 
+0

Я сделал ваше исправление в JSfiddle [здесь] (http://jsfiddle.net/3ocppxgL/2/) – Fuzzyzilla

+0

Спасибо за объяснение проблемы! :) – Fuzzyzilla

+0

Отличный ответ. @Fuzzyzilla, если вы хотите прочитать немного больше об этой проблеме, я написал об этом [здесь] (http://stackoverflow.com/a/18843648/1202830). –

0

Ваша проблема заключается в том, что при назначении image на temp, любые дальнейшие изменения на любой из этих объектов отражается на другом объекте.

Попробуйте следующий код вместо:

function newImage(){ 
    image = {}; 
    var temp = {} 
    for(i=0;i!=250;i++){ 
     temp[i] = {}; 
    } 
    for(var item in temp){ 
     image[item] = temp[item]; 
    } 
    for(i=0;i!=250;i++){ 
     image[i] = temp; 
    } 
} 
+0

Если вы изменили 'image [x]', то вы также меняете 'image [y]', поскольку они являются одним и тем же объектом, что, вероятно, не является тем, чего хочет OP. – MT0

Смежные вопросы