如何使用lodash过滤对象的键?

Fre*_*ind 160 javascript filter lodash

我有一个带有一些键的对象,我想只保留一些键值?

我尝试过filter:

const data = {
  aaa: 111,
  abb: 222,
  bbb: 333
};

const result = _.filter(data, (value, key) => key.startsWith("a"));

console.log(result);
Run Code Online (Sandbox Code Playgroud)

但它打印一个数组:

<script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.17.15/lodash.min.js"></script>
Run Code Online (Sandbox Code Playgroud)

这不是我想要的.

如何用lodash做到这一点?或者其他什么,如果lodash不工作?

现场演示:http://jsbin.com/moqufevigo/1/edit?js,output

ser*_*g10 254

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
Run Code Online (Sandbox Code Playgroud)
<script src="https://cdn.jsdelivr.net/lodash/4.16.4/lodash.min.js"></script>
Run Code Online (Sandbox Code Playgroud)

  • 似乎这在lodash版本4中被破坏了,并且新的_.pickBy谓词仅在值不是键的情况下被调用.嘘:( ...我想你可以链_Pick和_.pickBy(实际上没有你不能得到相同的功能) (9认同)
  • @EudisDuran你必须使用`.pickBy` (8认同)
  • @SDK它将在4.0.1中修复https://github.com/lodash/lodash/issues/1765 (3认同)
  • 这不再适用于最新的Lodash,只是一个FYI (3认同)
  • @EudisDuran它为我工作的最新版本的lodash v4.17.4 ...... (3认同)

小智 35

只需将过滤器更改为omitBy即可

const data = { aaa: 111, abb: 222, bbb: 333 };
const result = _.omitBy(data, (value, key) => !key.startsWith("a"));
console.log(result);
Run Code Online (Sandbox Code Playgroud)

  • 谢谢!而且我认为我们可以使用`_.pick` (4认同)

Pau*_*est 17

以下是使用lodash4.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 }
Run Code Online (Sandbox Code Playgroud)
<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>
Run Code Online (Sandbox Code Playgroud)


Nic*_*via 9

原生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);
Run Code Online (Sandbox Code Playgroud)


tho*_*max 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}
Run Code Online (Sandbox Code Playgroud)