2016-05-18 9 views
1

I持って現在2つのトップレベルの項目含む項目アレイを介してサブページ持ってサイト上のページを表し、次のJSON - 約やサービスについて:jQueryの再帰的オブジェクトの配列を反復処理し、値を返す

var data = '[{"id":107,"name":"About Us","route":"page","slug":"about","parent":0,"module":1,"items":[{"id":118,"name":"About Sub Page","route":"page","slug":"about-sub-page","parent":107,"items":[]}]},{"id":129,"name":"Services","route":"page","slug":"services","parent":0,"module":1,"items":[{"id":174,"name":"Services sub page","route":"page","slug":"services-sub-page","parent":129,"items":[]}]}]'; 

私は、オブジェクトの配列(data = JSON.parse(data))に対して再帰的に反復する関数を記述しようとしており、トップレベルの項目のインデックスを特定しています。たとえば、私の関数で 'about'スラッグを使用すると、about-sub-pageと同様に0が返されます。同様に、「サービス・サブページが」1

を返します私は、現時点ではこれを持っている:私は、しかし、トップレベルのスラグ例えば

var index = check('about',data); 
console.log(index); // returns 0 

var index = check('services',data); 
console.log(index); // returns 1 

を渡すと

data = JSON.parse(data); 

function check(slug,data) { 
var result; 
$.each(data, function(index){ 
    if (this.slug === slug) { 
    result = index; 
    return false; 
    } 
    else { 
    check(slug,this.items); 
    } 
}); 
    return result; 
} 

これは正常に動作します私は、サブページにしようと、私は、

var index = check('services-sub-page',data); 
console.log(index); // returns undefined 

は私が各ループから抜け出すためにはfalseを返す必要があると考えてい未定義取得します私はしようとすると、再帰的に関数を使用していない理由を確認していない。

+0

は、あなたが何をすべき '結果=チェック(スラグ、this.items);'、それは(そのelse節がヒットします)サブアイテムになるとそうでない場合、あなたは間違いなく、未定義戻ってきているので。 – James

+0

こんにちはジェームス、これを試しました - まだ未定義になっていますか? – Newfoundland

答えて

0

Array#some()を使用できます。これは、条件が満たされた場合に反復処理を停止するためです。

var data = '[{"id":107,"name":"About Us","route":"page","slug":"about","parent":0,"module":1,"items":[{"id":118,"name":"About Sub Page","route":"page","slug":"about-sub-page","parent":107,"items":[]}]},{"id":129,"name":"Services","route":"page","slug":"services","parent":0,"module":1,"items":[{"id":174,"name":"Services sub page","route":"page","slug":"services-sub-page","parent":129,"items":[]}]}]'; 
 

 
function check(slug, data) { 
 
    function iter(a, i) { 
 
     if (a.slug === slug || Array.isArray(a.items) && a.items.some(iter)) { 
 
      index = i; 
 
      return true; 
 
     } 
 
    } 
 

 
    var index, 
 
     array = JSON.parse(data); 
 

 
    array.some(iter) 
 
    return index; 
 
} 
 

 
document.write(check('about', data) + '<br>'); 
 
document.write(check('services', data) + '<br>'); 
 
document.write(check('services-sub-page', data) + '<br>');

+1

多くのありがとうニーナ! – Newfoundland

0

データ= JSON.parse(データ)。

機能チェック(スラッグ、データ){

var result;

$ .each(データ、関数(指数){

IF(this.slug ===他スラグ){

result = index; 

return false; 

}

{

結果= check(slug、this.items); //結果変数に代入する

}

});

返品結果;

}

+0

結果を変数 – sarath

+0

Hi Sams(とJames)が実装しましたが、まだ未定義になっていますので、check(slug、this.items) – Newfoundland

関連する問題