Làm cách nào để sử dụng phương thức bao gồm trong lodash để kiểm tra xem một đối tượng có trong bộ sưu tập không?


146

lodash cho phép tôi kiểm tra tư cách thành viên của các loại dữ liệu cơ bản với includes:

_.includes([1, 2, 3], 2)
> true

Nhưng những điều sau đây không hoạt động:

_.includes([{"a": 1}, {"b": 2}], {"b": 2})
> false

Điều này làm tôi bối rối vì các phương pháp sau đây tìm kiếm trong bộ sưu tập dường như chỉ hoạt động tốt:

_.where([{"a": 1}, {"b": 2}], {"b": 2})
> {"b": 2}
_.find([{"a": 1}, {"b": 2}], {"b": 2})
> {"b": 2}

Tôi đang làm gì sai? Làm cách nào để kiểm tra tư cách thành viên của một đối tượng trong bộ sưu tập với includes?

chỉnh sửa: câu hỏi ban đầu dành cho phiên bản lodash 2.4.1, được cập nhật cho lodash 4.0.0


7
_.containsđã bị xóa trong lodash v4 - sử dụng _.includesthay thế
Billy Moon

@BillyMoon woops! vâng, bạn đúng, lodash v4.0.0 (phát hành 2016-01-12) xóa containsbí danh. Tôi sẽ cập nhật thông tin này
Conrad.Dean

Câu trả lời:


222

Phương thức includes(trước đây được gọi containsinclude) so sánh các đối tượng theo tham chiếu (hay chính xác hơn là với ===). Bởi vì hai đối tượng bằng chữ {"b": 2}trong ví dụ của bạn đại diện cho các trường hợp khác nhau , chúng không bằng nhau. Để ý:

({"b": 2} === {"b": 2})
> false

Tuy nhiên, điều này sẽ hoạt động vì chỉ có một trường hợp {"b": 2}:

var a = {"a": 1}, b = {"b": 2};
_.includes([a, b], b);
> true

Mặt khác, where(không dùng trong v4) và findcác phương thức so sánh các đối tượng theo các thuộc tính của chúng, vì vậy chúng không yêu cầu đẳng thức tham chiếu. Thay thế cho includes, bạn có thể muốn thử some(cũng có bí danh là any):

_.some([{"a": 1}, {"b": 2}], {"b": 2})
> true

12

Bổ sung câu trả lời bằng cách p.s.w.g, sau đây là ba cách khác để đạt được điều này sử dụng lodash 4.17.5, mà không sử dụng _.includes() :

Giả sử bạn muốn thêm đối tượng entryvào một mảng các đối tượng numbers, chỉ khi entrychưa tồn tại.

let numbers = [
    { to: 1, from: 2 },
    { to: 3, from: 4 },
    { to: 5, from: 6 },
    { to: 7, from: 8 },
    { to: 1, from: 2 } // intentionally added duplicate
];

let entry = { to: 1, from: 2 };

/* 
 * 1. This will return the *index of the first* element that matches:
 */
_.findIndex(numbers, (o) => { return _.isMatch(o, entry) });
// output: 0


/* 
 * 2. This will return the entry that matches. Even if the entry exists
 *    multiple time, it is only returned once.
 */
_.find(numbers, (o) => { return _.isMatch(o, entry) });
// output: {to: 1, from: 2}


/* 
 * 3. This will return an array of objects containing all the matches.
 *    If an entry exists multiple times, if is returned multiple times.
 */
_.filter(numbers, _.matches(entry));
// output: [{to: 1, from: 2}, {to: 1, from: 2}]

Nếu bạn muốn trả về a Boolean, trong trường hợp đầu tiên, bạn có thể kiểm tra chỉ mục đang được trả về:

_.findIndex(numbers, (o) => { return _.isMatch(o, entry) }) > -1;
// output: true
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.