使用lodash按键过滤对象

13
我写了下面的函数来返回对象中与特定模式匹配的所有键。它似乎非常绕,因为在lodash中没有针对对象的筛选功能,当你使用它时,所有键都会丢失。这是使用lodash过滤对象键的唯一方法吗?

我编写了以下函数以返回与特定模式匹配的对象中的所有键。它似乎非常繁琐,因为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)
  }
}

1
可能是如何使用lodash过滤对象键?的重复问题。 - trushkevich
3个回答

27

你可以使用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}

谢谢!我一直在寻找一个能够“过滤”对象但是返回对象的答案。这个方法完美解决了我的问题。 - Eric
这应该被标记为正确答案,提出的问题是如何使用lodash来实现,而不是是否可以在没有它的情况下完成。 - Eli Himself

7

我认为您不需要使用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;
    });
  }
}

这很有趣,谢谢! - ThomasReggi
虽然使用纯JS也可以实现,但是在ES6中,我想我们根本不需要使用lodash或underscore :) - WitVault
1
@WitVault 我们肯定越来越接近了! - Rob M.
@RobM。它是否也能复现与lodash的"keysIn"函数完全相同的行为? - TheBilTheory

5
这是使用lodash的简洁方法- reduce()set() 是你的好朋友。
_.reduce(data, (result, value, key) => key.match(pattern) ? 
  _.set(result, key, value) : result, {});

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接