2016-09-29 56 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' 
    } 
    } 
    } 

相同級別的元素進入同一個數組。 因此,在這種情況下,結果應該是:

TopLevelArr = [level1, level2] 

SecondLevelArr = [level1Sub1, level1Sub2,level2Sub1,level2Sub2] 
使用jQuery遍歷整個對象

林:

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

做級別++; $。每();水平 - ;比級別應該包含你需要的數字... –

+0

你只需要2級所有的時間? – charlietfl

回答

1

你可以使用一個迭代和遞歸獲取所有密鑰的方法。

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} 

我想用jQuery是在這種情況下很不必要的,這就是爲什麼我用於...

+0

感謝您花時間幫助。 – user2915962