2016-09-29 4 views
1

オブジェクトのキーから配列を作成しようとしています。私はこの構造のオブジェクトを持っているかもしれません:オブジェクトをトラバースしてキー/値を選択する

$scope.myobj = { 
'level1': { 
    'level1Sub1': { 
     'result': 'level1-level1Sub1-result' 
    }, 
    'level1Sub2': { 
      'result': 'level1-level1Sub2-result' 
    } 
    }, 
'level2': { 
    'level2Sub1': { 
     'result': 'level2-level2Sub1-result' 
    }, 
    'level2Sub2': { 
      'result': 'level2-level2Sub2-result' 
    } 
    } 
    } 

同じレベルの要素は同じ配列になります。 したがって、この場合の結果は次のようになります。オブジェクト全体を横断するjqueryのを使用して

TopLevelArr = [level1, level2] 

SecondLevelArr = [level1Sub1, level1Sub2,level2Sub1,level2Sub2] 

イム:

var path = ""; 

$.each($scope.myobj, walker); 

function walker(key, value) { 
    var savepath = path; 

    path = path ? (path + "." + key) : key; 
    console.log(path) 


    if (value !== null && typeof value === "object") { 
     // Recurse into children 
     $.each(value, walker); 
    } 

    path = savepath; 
} 

私はにキーを渡す方法を見つけることができればこれはかなり近いはずそのレベルに基づいて適切な配列。

http://jsfiddle.net/bald1/ys05m1s8/2/

ヘルプは大歓迎します。ありがとうございました。

+0

[ 'Object.keys()']に見て(https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/キー)... –

+0

Do level ++; $。each();レベル - ;レベルよりも必要な番号を含める必要があります... –

+0

あなたは2つのレベルを常に必要とするのですか? – charlietfl

答えて

1

に使用なぜあなたは、反復と再帰を使用することができますthatsの、jqueryのを使用している場合にはかなりに、不要なであると思いましたすべてのキーを取得するアプローチ。

function getKeys(o) { 
 
    function iter(o, i) { 
 
     var k = Object.keys(o); 
 
     keys[i] = keys[i] || []; 
 
     k.forEach(function (kk) { 
 
      if (keys[i].indexOf(kk) < 0) { 
 
       keys[i].push(kk); 
 
      } 
 
      if (o[kk] !== null && typeof o[kk] === 'object') { 
 
       iter(o[kk], i + 1); 
 
      } 
 
     }); 
 
    } 
 

 
    var keys = []; 
 
    iter(o, 0); 
 
    return keys; 
 
} 
 

 
var $scope = {}; 
 
$scope.myobj = { 'level1': { 'level1Sub1': { 'result': 'level1-level1Sub1-result' }, 'level1Sub2': { 'result': 'level1-level1Sub2-result' } }, 'level2': { 'level2Sub1': { 'result': 'level2-level2Sub1-result' }, 'level2Sub2': { 'result': 'level2-level2Sub2-result' } } }; 
 

 
console.log(getKeys($scope.myobj));
.as-console-wrapper { max-height: 100% !important; top: 0; }

+1

ありがとうございます!それは最高です。 – user2915962

1
var level=0; 
var levelarray=[]; 
function looptrough(obj){ 
for(key in obj){ 
if(typeof obj[key]=="object"){ 
level++; 
looptrough(obj[key]); 
level--; 
} 
levelarray[level]=levelarray[level] || {}; 
levelarray[level][key]=obj[key]; 
} 
} 
looptrough({a:true;b:{c:true}}); 

Levelarrayは今含まれている必要があります

0:{a:true;b:{c:true}} 
1:{c:true} 

私はで...

+0

時間を割いていただきありがとうございます。 – user2915962

関連する問題