如何使用 lodash 过滤对象的键?
Posted
技术标签:
【中文标题】如何使用 lodash 过滤对象的键?【英文标题】:How to filter keys of an object with lodash? 【发布时间】:2015-08-23 23:07:21 【问题描述】:我有一个带有一些键的对象,我只想保留一些键的值?
我试过filter
:
const data =
aaa: 111,
abb: 222,
bbb: 333
;
const result = _.filter(data, (value, key) => key.startsWith("a"));
console.log(result);
<script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.17.15/lodash.min.js"></script>
但它会打印一个数组:
[111, 222]
这不是我想要的。
如何用 lodash 做到这一点?或者如果 lodash 不工作的其他东西?
【问题讨论】:
【参考方案1】:Lodash 有一个 _.pickBy
函数,它完全符合您的要求。
var thing =
"a": 123,
"b": 456,
"abc": 6789
;
var result = _.pickBy(thing, function(value, key)
return _.startsWith(key, "a");
);
console.log(result.abc) // 6789
console.log(result.b) // undefined
<script src="https://cdn.jsdelivr.net/lodash/4.16.4/lodash.min.js"></script>
【讨论】:
这似乎在 lodash 版本 4 中被破坏了,新的 _.pickBy 谓词仅使用值而不是键调用。 Boo :( ...我想您可以链接 _.pick 和 _.pickBy (实际上不,您无法获得相同的功能) 这不再适用于最新的 Lodash,仅供参考 @EudisDuran 你必须使用.pickBy
好像已经用最新版本修复了【参考方案2】:
只需将过滤器更改为omitBy
const data = aaa: 111, abb: 222, bbb: 333 ;
const result = _.omitBy(data, (value, key) => !key.startsWith("a"));
console.log(result);
<script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.17.15/lodash.min.js"></script>
【讨论】:
这还不打印一个数组吗? 谢谢!我认为我们可以使用_.pick
这不再适用于最新的 lodash,仅供参考【参考方案3】:
这是一个使用lodash
4.x 的示例:
const data =
aaa: 111,
abb: 222,
bbb: 333
;
const result = _.pickBy(data, (value, key) => key.startsWith("a"));
console.log(result);
// Object aaa: 111, abb: 222
<script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.17.15/lodash.min.js"></script>
<strong>Open your javascript console to see the output.</strong>
【讨论】:
【参考方案4】:原生ES2019单行
const data =
aaa: 111,
abb: 222,
bbb: 333
;
const filteredByKey = Object.fromEntries(Object.entries(data).filter(([key, value]) => key.startsWith("a")))
console.log(filteredByKey);
【讨论】:
【参考方案5】:一种以相当可读和有效的方式解决此问题的非 lodash 方法:
function filterByKeys(obj, keys = [])
const filtered =
keys.forEach(key =>
if (obj.hasOwnProperty(key))
filtered[key] = obj[key]
)
return filtered
const myObject =
a: 1,
b: 'bananas',
d: null
const result = filterByKeys(myObject, ['a', 'd', 'e'])
console.log(result) // a: 1, d: null
【讨论】:
【参考方案6】:const data =
aaa: 111,
abb: 222,
bbb: 333
;
const result = Object.keys(data).filter((val) => val.includes("a"));
console.log(result);
【讨论】:
这是一种过滤对象键的非 lodash 方式,原始问题说明了一种使用 lodash 过滤对象键的方法。 @ShahidManzoorBhat OP 提到他可以使用非 lodash 解决方案,但此解决方案将返回一个键数组,而不是只包含所需键的对象。【参考方案7】:纯JS解决方案:
const data =
aaa: 111,
abb: 222,
bbb: 333
;
const result = Object.keys(data).filter( key =>
return key.indexOf('a') == 0
).map( key =>
return key: data[key]
)
console.log(result)
-
筛选以字母“a”开头的键的数据
将这些键映射到正确的值,并作为 key:value 对象返回
【讨论】:
【参考方案8】:您可以使用_.omit()
函数。
它接受 过滤键 作为字符串数组,如下所示:
var object = a: 1, b: 2, c: 3
_.omit(object, ['a', 'c'])
// => b: 2
【讨论】:
以上是关于如何使用 lodash 过滤对象的键?的主要内容,如果未能解决你的问题,请参考以下文章
如何使用 JavaScript (lodash) 深度映射对象键?
如何使用 lodash _.filter() 过滤 Firestore 集合?