如何在lodash版本4中获得_.pick功能

5

据我所知,下面展示的答案在lodash v4中已经失效。

var thing = {
  "a": 123,
  "b": 456,
  "abc": 6789
};

var result = _.pick(thing, function(value, key) {
  return _.startsWith(key, "a");
});

console.log(result.abc) // 6789
console.log(result.b)   // undefined

在Lodash版本4中,您该如何执行此操作?
3个回答

2

更新(2月8日)

从v4.0.1开始,_.omitBy和_.pickBy现在提供一个key参数来表示断言。因此,正确的答案是:

使用_.pickBy(object, [predicate=_.identity])

原始答案

从v4开始,一些方法已经分离。例如,_.pick()已分成_.pick(array, [props])_.pickBy(object, [predicate=_.identity])

我的第一个尝试是使用_.pickBy()方法。不幸的是,所有...By()方法只传递值作为第一个参数。它们不会获取键或集合,因此仅将_.pick()切换到_.pickBy()是无效的。

但是,可以这样做:

var thing = {
  "a": 123,
  "b": 456,
  "abc": 6789
};

var result = _.pick(thing, _(thing).keys().filter(function(key) {
  return _.startsWith(key, "a");
}).value());

console.log(result)

我也尝试过同样的方法,使用_.pick和_.pickBy链式调用 - 但没有成功。我会给你点创意奖励,但不能真正接受作为优雅的答案。在我看来,他们实际上删除了功能。 - SDK

0

嗯,没有记录_.startsWith()已从Lodash中删除。

不管怎样,如何解析键的第一个字符?

var result = _.pick(thing, function(value, key) {
  return key[0] == "a";
});

在v4中,_.pick()不再接受谓词。这就是现在_.pickBy所做的事情。有关更多详细信息,请参见我的答案。 - NicBright

0
var thing = {
  "a": 123,
  "b": 456,
  "abc": 6789
};

_.pick(object, arrayOfProperties)
_.pick(thing,["a","b"])={"a":123,"b":456}

当你使用rest API时,这种方法非常有用。从解析req.body创建对象的方式如下。

router.post("/users", async (req, res) => {
  const user = new User({
    name: req.body.name,
    email: req.body.email,
    password: req.body.password,
    age: req.body.age
  });});

正如你所看到的,这看起来很难看,让人头疼。相反地

const user=new User(_.pick(req.body,["name","email","password","age"]))

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