2016-07-09 14 views
1

比方說,我有一個深刻的對象這樣的JavaScript/lodash:如何對象得益於子樹對象在執行遞歸深得

cont obj = { 
    a0: { 
    b0: { 
     c0: 0, 
     c1: 1 
     }, 
     b1: { 
     c2: 2 
     } 
    } 
} 

,我想在一個單一的方法來檢索子用這種API的這棵樹,讓我們將其命名爲「retrieveDeep」:

const subObj = retrieveDeep(
obj, 
{ 
    a0: { 
    b0: { 
     c0: null 
    }, 
    b1: { 
     c2: null 
    } 
    } 
} 
) 
// should return 
// { 
// a0: { 
//  b0: { 
//  c0: 0 
//  }, 
//  b1: { 
//  c2: 2 
//  } 
//  } 
// } 

其實我知道,我可以實現從無到有有沒有那麼多的困難,但如果已經有一個lodash(甚至把它看起來有點像graphQL api shape!)功能,我很樂意知道它 tx

+0

我剛剛在這裏使用值'null'作爲定位佔位符(這是一個任意的選擇),被替換爲匹配相應鍵的真實值...所以它被一個對象,一個數字,一個字符串......它只取決於源對象中的相應值。 –

+1

和你有什麼嘗試? –

+0

現在還沒有,實際上我可以在10分鐘內寫出遞歸函數,但我想確保這個問題沒有同步,並且已經是社區中的特定共享函數:)。 –

回答

1

只需遍歷模式的屬性並對對象進行遞歸調用即可。分配原始值。

function retrieveDeep(object, pattern) { 
 
    function iter(o, p, r) { 
 
     Object.keys(p).forEach(function (k) { 
 
      if (k in o) { 
 
       if (typeof o[k] === 'object' && o[k] !== null) { 
 
        r[k] = {}; 
 
        iter(o[k], p[k], r[k]); 
 
        return; 
 
       } 
 
       r[k] = o[k]; 
 
      } 
 
     }); 
 
    } 
 
    
 
    var result = {}; 
 
    iter(object, pattern, result); 
 
    return result; 
 
} 
 

 
var obj = { a0: { b0: { c0: 0, c1: 1 }, b1: { c2: 2 } } }, 
 
    subObj = retrieveDeep(obj, { a0: { b0: { c0: null }, b1: { c2: null } } }); 
 

 
console.log(subObj);

+1

酷tx!我實際上已經用if(p [k]!== null)替換了if(typeof o [k] ==='object')'的條件來實際上也獲得了可能的嵌套對象,也想要。 –

1

隨着lodash 1+,有使用_.at最短方式(對象,[路徑])

let exist = { 
 
    a:{ 
 
    b: {c: 3} 
 
    }, 
 
    ZZ: 2 
 
}; 
 
    
 
let resExist = _.at(exist, 'a.b.c').pop() // => 3 
 

 
let notExit = { a : 1 } 
 
    
 
let resNoExist = _.at(notExit, 'a.b.c').pop() // undefined 
 
    
 
console.log('resExist', resExist) 
 
console.log('resNoExist', resNoExist)
<script src="https://cdn.jsdelivr.net/lodash/4.17.4/lodash.min.js"></script>

documention