2016-02-12 78 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}