0

ユーザーがアプリを移動するときに、サイトマップ配列を埋めています。

ただし、サイトマップを埋める私のロジックには欠陥があります。これが私がやっていることです:

var siteMap = [],
    j = siteMap.length;

$(document).on( "pagebeforechange", function( e, data ) {

    if (j == 0 ){
        // add cause sitemap has no elements
        siteMap.push( { type: "external", data: data });
        } else {
            // loop through the sitemap object
            for ( var i = 0; i < j; i++) {
            // check if element is already stored
            if ( data.toPage == self.options.siteMap[i].data.toPage ){
                break;
                }   
            self.options.siteMap.push( { type: "external", data: data } );
            }           
        }
    }); 

問題は、休憩が期待どおりに機能しないことです。サイトマップをループして、data.toPage (/some/page.html のような文字列) を既に保存したものと比較したかったのです。一致が見つかった場合、新しい要素をサイトマップにプッシュせにループを終了する必要があります。ただし、現在ループしており、ループ位置 (1) で要素が見つからない場合、ブレークは発生せず、エントリが一致するまですべてのループにエントリを追加しています。

質問:
ループを修正して、一致するものが存在しない場合にのみエントリを追加するにはどうすればよいですか?

手伝ってくれてありがとう!

編集:
これは私が今持っているものです:

(function( $, window) {
   $.widget("mobile.multiview",$.mobile.widget, {   
      options: {
         siteMap = {};
         },
      eventBindings: function() {

        $(document).on( "pagebeforechange", function( e, data ) {

            var self = this;
            if (!self.options.siteMap[data.toPage]){
               self.options.siteMap[data.toPage] = { type: "external", data: data };
               }
            });
        }
 }) (jQuery,this);
4

1 に答える 1

1

ループは各反復でテストを実行します。探しているものが見つかるまで、繰り返しごとに新しいエントリを追加します。

代わりに行う必要があるのは、要素が既に配列にあるかどうかを確認し、そうでない場合は追加することです。いっそのこと、最初に配列を使用するという考えを捨てて、単に「toPage」値をオブジェクト プロパティとして使用します。

var sitemap = {};

$(document).on( "pagebeforechange", function( e, data ) {
  if (!sitemap[ data.toPage ])
    sitemap[data.toPage] = { type: "external", data: data };
});
于 2012-05-26T13:08:56.103 に答える