Làm thế nào để lọc các khóa của một đối tượng với lodash?


178

Tôi có một đối tượng với một số khóa và tôi chỉ muốn giữ một số khóa có giá trị của chúng?

Tôi đã thử với 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>

Nhưng nó in một mảng:

[111, 222]

Đó không phải là điều tôi muốn.

Làm thế nào để làm điều đó với lodash? Hoặc một cái gì đó khác nếu lodash không hoạt động?

Câu trả lời:


285

Lodash có một _.pickBychức năng thực hiện chính xác những gì bạn đang tìm kiếm.

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>


9
Có vẻ như điều này đã bị hỏng trong phiên bản lodash 4 và vị từ _.pickBy mới chỉ được gọi với giá trị không phải là khóa. Boo :( ... Tôi cho rằng bạn có thể xâu chuỗi _.pick và _.pickBy (thực ra là không bạn không thể có cùng chức năng)
SDK

3
Điều này không còn hoạt động kể từ phiên bản mới nhất, chỉ là một FYI
Eudis Duran

8
@EudisDuran bạn phải sử dụng.pickBy
apfelbox

dường như đã được sửa với phiên bản mới nhất

39

Chỉ cần thay đổi bộ lọc thành 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>


Điều này vẫn không in một mảng?
Mr_Green

4
Cảm ơn! Và tôi nghĩ chúng ta có thể sử dụng_.pick
Freewind

Điều này không còn hoạt động kể từ bản lodash mới nhất, chỉ là một FYI
Eudis Duran

18

Dưới đây là một ví dụ sử dụng 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 }
<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

Một cách không lodash để giải quyết vấn đề này một cách khá dễ đọc và hiệu quả:

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']) // {a: 1, d: null}
console.log(result)

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.