在 SO 上发现一个题目:
I need to end up with an array of the Branch Codes found in the child Details. Here is the output I'm attempting to get:
{ "TITLE": { "FirstLevel": { "Details": { "Code": "01", }, "SecondLevel": [ { "Details": { "Description": "{desc}", }, "ThirdLevel": { "Details": { "Code": "01", }, "FourthLevel": [ { "Details": { "Code": "11", }, "Branch": { "Details": { "Code": "1000", } } }, { "Details": { "Code": "12", }, "Branch": [ { "Details": { "Code": "1201", } }, { "Details": { "Code": "1202", } } ] } ] } }, { "Details": { "Code": "100", }, "ThirdLevel": [ { "Details": { "Code": "02", }, "FourthLevel": { "Details": { "Code": "21" }, "Branch": { "Details": { "Code": "2101", } } } }, { "Details": { "Code": "03", }, "FourthLevel": [ { "Details": { "Code": "31", }, "Branch": { "Details": { "Code": "3101", } } }, { "Details": { "Code": "32", }, "Branch": { "Details": { "Code": "3201", } } } ] } ] } ] } } }
考虑下代码,我给出了这样的答案:
function transData(data, propertyName, path, result = []) { if (data instanceof Array) { data.forEach(obj => transData(obj, propertyName, path, result)); } else if (data instanceof Object) { let existProperty = Object.keys(data).indexOf(propertyName) > -1; if (existProperty) { getCode(data[propertyName], path, result); } else { Object.keys(data).forEach(key => transData(data[key], propertyName, path, result)); } } function getCode(data, path, result) { if (data instanceof Array) { data.forEach(obj => getCode(obj, path, result)); } else { if (typeof path !== 'undefined') { result.push(path.split(/./g).reduce((accumulator, val) => accumulator = accumulator[val], data)); } else { result.push(data); } } } return result; }
如果你 log 下:
console.log(transData(obj, 'Branch', 'Details.Code'));
//[ '1000', '1201', '1202', '2101', '3101', '3201' ] console.log(transData(obj, 'Branch')); /*[ { Details: { Code: '1000' } }, { Details: { Code: '1201' } }, { Details: { Code: '1202' } }, { Details: { Code: '2101' } }, { Details: { Code: '3101' } }, { Details: { Code: '3201' } } ]*/
后来发现这个情况挺普遍的,代码具有移植性,所以就记录下;
参考: