如何使用 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 集合?

如何根据同一对象内给定的键值过滤对象

根据属性值用 lodash 过滤对象数组

如何在 Javascript/Lodash/ES6 中同时搜索父对象和子对象?

使用 lodash .groupBy。如何为分组输出添加自己的键?