2017-02-22 15 views
2

私はすべてのデータを格納するために約10レベルのオブジェクトと配列を持つスライダビルダーで作業しています。最初の4つはほぼ同じ構造ですが、異なる配列になっています。冒頭で深いオブジェクトのリテラルへの省略形?

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]; 

:たとえば、次のように任意の時点で、私はおそらく同じスライド、同じ層に取り組んでいますので、私は、私のようないくつかの変数を宣言する可能性が考えていた

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

このアプリケーションの最初の例をこのように簡略化するために使用することができます。

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オブジェクトに情報をプッシュする前に、すべての変数をメモリにロードしようとする可能性があります。そのようにすると、Slides [0]オブジェクトには何もないので失敗します。私は後でユーザーのやりとりで更新することで問題を回避する方法を検討しています。 – Alan

関連する問題