2017-04-11 81 views
1

有沒有任何方法可以在路徑中獲取值,並且如果它們不被定義,則可以使用回退到其他路徑的路徑?Lodash - 使用默認值在路徑上獲取價值

var object = { a: 1 } 

// Try to get d, fallback to e and then a 
_.get(object, 'd', _.get(object, 'e', _.get(object, 'a'))) 

有沒有更好的方法來解決這個問題?

+0

你需要嚴格後備未定義的屬性,也可以是假的太?如果你想爲falsy值回退,你可以做obj.d || obj.e || obj.f,否則你可以用object.hasOwnProperty做一個循環,並返回定義的第一個匹配鍵的值。 – Christopher

+0

最好只適用於未定義的,但在這裏可以接受任何虛假的東西。尋找一些比obj.d更習慣的東西obj.e || obj.f'。類似'_.pick',但是爲了選擇一個值,而不是選擇鍵。 –

回答

2

想我會爲這一點,但還是想看看是否有人想出了更好的東西用lodash。

_.get(object, _.findKey(object, _.rearg(_.partial(_.includes, ['d', 'e', 'f']), 1))) 

更新

如果u想找到嵌套路徑鍵,以便返回上述不會工作:

_(object).at('b', 'c', 'd', 'e', 'a').compact().first() 
1

你可以爲此做出自己的幫助方法,也許這樣?

function pickValue(obj, keys, defaultValue) { 
    var foundKey = keys.find(function(key) { return obj.hasOwnProperty(key); }); 
    return foundKey ? obj[foundKey] : defaultValue; 
} 

用法:

var result = pickValue(obj, ['d', 'e', 'f'], 'default value'); 
+0

謝謝:)但不喜歡mixin。 –

+1

我剛剛想出了__first(_。compact(_。at(object,'b','c','d','e','a')))' –

+0

這是一個更好的?不確定關於可讀性tho –