2016-02-12 109 views
3

我編寫了下面的函數來返回匹配特定模式的對象中的所有鍵。它看起來真的很圓,因爲在對象中沒有過濾器函數,當你使用它時,所有的鍵都丟失了。這是使用lodash過濾對象鍵的唯一方法嗎?用lodash中的鍵過濾對象

export function keysThatMatch (pattern) { 
    return (data) => { 
    let x = _.chain(data) 
    .mapValues((value, key) => { 
     return [{ 
     key: key, 
     value: value 
     }] 
    }) 
    .values() 
    .filter(data => { 
     return data[0].key.match(pattern) 
    }) 
    .zipWith(data => { 
     let tmp = {} 
     tmp[data[0].key] = data[0].value 
     return tmp 
    }) 
    .value() 
    return _.extend.apply(null, x) 
    } 
} 
+0

可能的複製開始鍵的對象[如何篩選與lodash對象的鍵?](https://stackoverflow.com/問題/ 30726830/how-to-filter-key-of-object-with-lodash) – trushkevich

回答

6

我不認爲你需要lodash對於這一點,我只想用Object.keys,火柴過濾然後回落降低這樣一個對象(未經測試,但應工作):

export function keysThatMatch (pattern) { 
    return (data) => { 
    return Object.keys(data).filter((key) => { 
     return key.match(pattern); 
    }).reduce((obj, curKey) => { 
     obj[curKey] = data[curKey]; 
     return obj; 
    }); 
    } 
} 
+0

這很有趣,謝謝! – ThomasReggi

+0

我的榮幸,希望我沒有犯任何錯誤:) –

+0

雖然這可能與普通的js,es6我想我們並不需要lodash或下劃線的所有:) – WitVault

1

這是一個簡潔的方式來做到這一點與lodash - reduce()set()是你的朋友。

_.reduce(data, (result, value, key) => key.match(pattern) ? 
    _.set(result, key, value) : result, {}); 
7

您可以使用lodash的pickBy來做到這一點。 (https://lodash.com/docs#pickBy

本示例返回與用「A」

var object = { 'a': 1, 'b': '2', 'c': 3, 'aa': 5}; 

o2 = _.pickBy(object, function(v, k) { 
    return k[0] === 'a'; 
}); 

o2 === {"a":1,"aa":5}