2

「これ」を期待どおりに動作させるのに問題があります-

基本的に、私はオブジェクトを持っていますが、同じオブジェクト内の関数からオブジェクト内の配列にアクセスできません -

次のようになります。

var articles = {
    article : {
        1: {
            title : 'This is a Title',
            content : 'This is the content of the article'
        },
        2: {
            title : 'This is the second article',
            content : 'This is the second article content'   
        },
        3: {
            title : 'This is the third article',
            content : 'Making information transferrable. Identifiable. Manipulatable.'   
        }
    },
    numArticles : function(){
        var size = 0, key;
        for (key in this.article){
            if(this.article.hasOwnProperty(key)) size++;               
        }
        return size;
    },
    buildInterface : function(){
        var aSize = this.numArticles();
        for(var i = 0; i < aSize; i++){
            $('body').append('<article><h2>' + this.article[i].title + '</h2></article>');               
        }
    }
}

このシナリオでは、buildInterface() 関数は「article」配列にアクセスできません。

これが進行中の例です。

http://jsfiddle.net/merk/xV2n6/41/

ここで何か助けていただければ幸いです-

スコーピングの問題かもしれないという予感があります-うまくいけば、それはJSFiddleに関連するものではありません-

どうもありがとう -

平和

マーク

4

2 に答える 2

3

変数のインデックス付けに一貫性がありませんarticle。プロパティは から始まるように定義されていますが、メソッドループ内1から開始しています。これを修正するには...0buildArticlesfor

for(var i = 1; i <= aSize; i++){
  $('body').append('<article><h2>' + this.article[i].title + '</h2></article>');               
};

...または(基本的に配列の作業にオブジェクトを使用しようとしているので、私の好みではそれがはるかに優れています)article定義を適切な配列に書き直します:

article : [{
        title : 'This is a Title',
        content : 'This is the content of the article'
    }, {
    title : 'This is the second article',
    content : 'This is the second article content'   
    }, {
    title : 'This is the third article',
    content : 'Making information transferrable. Identifiable. Manipulatable.'   
    }],
...

... buildArticlesforループをそのままにしておきます (インデックスが 0 から適切に開始されるようになったため)。

ところで、この方法では、記事をカウントするための特別な関数を作成する必要さえありませんarticle.length。それで十分です。

これは、このアプローチの図を使用したJS Fiddleです。


補足として、実際にデバッガーをチェックした場合は、this.articles[0]それが. したがって、それは間違いなく範囲の問題ではありません。undefinedtitlethis.articles

于 2012-11-24T19:49:06.497 に答える
0

これはうまくいくはずです:

var articles = {
    article : {
        1: {
            title : 'This is a Title',
            content : 'This is the content of the article'
        },
        2: {
        title : 'This is the second article',
        content : 'This is the second article content'   
        },
        3: {
        title : 'This is the third article',
        content : 'Making information transferrable. Identifiable. Manipulatable.'   
        }
    },
    numArticles : function(){
        var size = 0, key;
        for (key in this.article){
            if(this.article.hasOwnProperty(key)) size++;               
        }
        return size;
    },
    buildInterface : function(){
        var aSize = this.numArticles();
        for(var i = 1; i <= aSize; i++){
            console.log( '<article><h2>' + this.article[i]['title'] + '</h2></article>');               
        };
    }
}

あなたの場合の問題は、配列のゼロ位置にある要素から始めたことです。しかし、0要素はありません。したがって、エラーが発生します。そして、これは期待どおりに機能しています。

于 2012-11-24T19:53:45.227 に答える