2017-02-22 93 views
2

Я работаю с ползунковым конструктором, который имеет около 10 уровней объектов и массивов для хранения всех данных. Первые 4 почти всегда структурированы одинаково, но находятся в разных массивах. Например:Сокращение до глубокого объекта буквально?

Slides[thisSlide].layers[thisLayer].animationgroup[thisAnimationId].sequence[currentSegment].duration 

, где в любой момент времени я, вероятно, работает на том же слайде, в том же слое, поэтому я думал, что я мог бы объявить некоторые переменные, такие как:

var currentSlide = 0; 
var currentLayer = 0; 
var currentChild = "0"; 
var currentKeyframe = ""; 
    Slides.push({ 
    "background-color": "#aaaaaa", 
    "canvasHeight": "200", 
    "canvasWidth": "1000", 
    "layers": [] 
    }); 
var CSL = Slides[currentSlide].layers[currentLayer]; 
var CAG = Slides[thisSlide].layers[thisLayer].animationgroup[thisAnimationId]; 

в начале приложения, которые затем могут быть использованы для обсчитывать первый пример таким образом:

CAG.sequence[currentSegment].duration; 

он не работает, как я ожидал, что это. позже, когда я попытался использовать его, я получаю жалобы, что CSL не определен, и тем не менее она должна быть в глобальном масштабе:

function updateStuff(){ 
    for (i = 0; i < CSL.length; i++) { 
     //do something 
    } 
} 

Я просто пытаюсь сократить мой код немного, как я работаю над этим и устранить вещи, которые действительно не должны быть там.

+0

Предполагая, что объект существует во всех этих слоях, я не вижу никаких проблем с записью, которую вы опубликовали. Вы должны иметь возможность работать с этими сокращениями. – Rikin

+0

Это должно работать, пока вы не будете иметь * замыкание * на переменной, которая используется в качестве индексов в операторах. – Agalo

+0

Это то, о чем я тоже думал, я обновил его, чтобы показать, где у меня проблема. – Alan

ответ

2

В вашем примере здесь:

var currentSlide = 0; 
var currentLayer = 0; 
var currentChild = "0"; 
var currentKeyframe = ""; 
    Slides.push({ 
    "background-color": "#aaaaaa", 
    "canvasHeight": "200", 
    "canvasWidth": "1000", 
    "layers": [] 
    }); 
var CSL = Slides[currentSlide].layers[currentLayer]; 

Похоже layers массив пуст, поэтому индексацию в layers массив будет возвращать неопределенными в CSL в этом случае.

Обратите внимание, что если есть определенный в то время объект, вы действительно получите ссылку на этот объект, но если ничего не определено, то CSL присваивается «тип значения» undefined без ссылки.

+0

Я думаю, что это может иметь отношение к порядку операций. Он может попытаться загрузить все переменные в память, прежде чем вставлять информацию в объект «Слайды». Когда это делается так, в объекте Slides [0] ничего не происходит, и поэтому он терпит неудачу. Я рассматриваю, как решить проблему, обновив ее позже при взаимодействии с пользователем. – Alan