2017-02-15 62 views
2

我有像一個對象:此對象的複雜的對象值分析

var exampleObject = { 
    listItem1: 1, 
    subList: { 
     subSubList: { 
      subSubListItem1: 1, 
      subSubListItem2: 'green' 
     }, 
     subListItem1: 'blue' 
    } 
}; 

值可以是數字,字符串數組和另一個對象。我需要得到的字符串路徑數組的鍵值削減,其中值等於1號。對於exampleObject是:

[ 
    "listItem1", 
    "subList > subSubList > subSubListItem1" 
] 

我怎麼能接受從只使用的JavaScript結構的所有對象的數組?

+0

推到一個數組 –

+0

如果有一種像一個屬性:'子列表:[{X:1},{X:1}]',怎麼會是這樣顯示的? – Cerbrus

回答

0

您可以檢查項目是否爲對象並迭代密鑰。如果沒有,則找到結束,並將實際路徑添加到結果集中。

function getPath(object) { 
 
    function iter(o, p) { 
 
     if (o && typeof o === 'object') { 
 
      Object.keys(o).forEach(function (k) { 
 
       iter(o[k], p.concat(k)); 
 
      }); 
 
     } else if (o === 1){ 
 
      result.push(p.join(' > ')); 
 
     } 
 
    } 
 
    
 
    var result = []; 
 
    iter(object, []); 
 
    return result; 
 
} 
 

 
var exampleObject = { listItem1: 1, subList: { subSubList: { subSubListItem1: 1, subSubListItem2: 'green' }, subListItem1: 'blue' } }; 
 

 
console.log(getPath(exampleObject));

0

可以使用for...in遞歸。這裏是mdn page

function getNext(obj){ 
    for(var val in obj){ 
     if(typeof obj[val] === 'object') 
     return val + ' > ' + getNext(obj[val]); 
     else if(obj[val] === 1){ 
     delete obj[val]; 
     return val; 
     } 
    } 
} 
var list = []; 
while(Object.keys(exampleObject).length > 0) 
    list.push(getNext(exampleObject); 

list.filter(function(x){ return x[ x.length - 1 ] === ' '; }); 
0

您可以使用for...in循環創建遞歸函數。

var exampleObject = { 
 
    listItem1: 1, 
 
    subList: { 
 
    subSubList: { 
 
     subSubListItem1: 1, 
 
     subSubListItem2: 'green' 
 
    }, 
 
    subListItem1: 'blue' 
 
    } 
 
}; 
 

 
function getKeys(data, val) { 
 
    var result = []; 
 

 
    function inner(data, val, keys) { 
 
    for (var i in data) { 
 
     if (data[i] == val) result.push((keys + ' > ' + i).substr(3)) 
 
     if (typeof data[i] == 'object' && inner(data[i], val, keys + ' > ' + i)) { 
 
     result = result.concat(inner(data[i], val, keys + ' > ' + i)) 
 
     } 
 

 
    } 
 
    } 
 
    inner(data, val, '') 
 
    return result 
 
} 
 

 
console.log(JSON.stringify(getKeys(exampleObject, 1), 0, 4)) 
 
console.log(JSON.stringify(getKeys(exampleObject, 'green'), 0, 4)) 
 
console.log(JSON.stringify(getKeys(exampleObject, 'blue'), 0, 4))