Lodash loại bỏ trùng lặp từ mảng


232

Đây là dữ liệu của tôi:

[
    {
        url: 'www.example.com/hello',
        id: "22"    
    },
    {
        url: 'www.example.com/hello',
        id: "22"    
    },
    {
        url: 'www.example.com/hello-how-are-you',
        id: "23"    
    },
    {
        url: 'www.example.com/i-like-cats',
        id: "24"    
    },
    {
        url: 'www.example.com/i-like-pie',
        id: "25"    
    }
]

Với Lodash, làm cách nào tôi có thể xóa các đối tượng bằng các khóa id trùng lặp? Một cái gì đó với bộ lọc, bản đồ và độc đáo, nhưng không hoàn toàn chắc chắn.

Tập dữ liệu thực của tôi lớn hơn nhiều và có nhiều khóa hơn, nhưng khái niệm này phải giống nhau.

Câu trả lời:


439

_.uniquekhông còn hoạt động cho phiên bản hiện tại vì lodash 4.0.0 có sự thay đổi đột phá này . Các chức năng đã được chia thành _.uniq, _.sortUniq, _.sortUniqBy, & _.uniqBy

Bạn có thể sử dụng _.uniqBymột trong hai

_.uniqBy(data, function (e) {
  return e.id;
});

hoặc là

_.uniqBy(data, 'id');

Tài liệu: https://lodash.com/docs#uniqBy


Đối với các phiên bản cũ hơn của lodash (<4.0.0)

Giả sử rằng dữ liệu phải là duy nhất idvà dữ liệu của bạn được lưu trữ trong databiến, bạn có thể sử dụng hàm unique () như thế này:

_.unique(data, function (e) {
  return e.id;
});

Hoặc đơn giản

_.uniq(data, 'id');

1
Các tài liệu lodash 4.0.1 đã thay đổi điều này thành uniqBy. Không thể lấy ví dụ trên để làm việc cho cuộc sống của tôi chỉ bằng uniq.
Will Lovett

2
Với lodash 4.x, uniq () chỉ chấp nhận một tham số, đó là một mảng. Vì vậy, như @WillLovett đã nói, chúng ta có thể sử dụng uniqBy () để giải quyết vấn đề này.
ersefuril

1
Oh Boy. Tại sao, ồ tại sao, nó uniqđược phát âm là bạn-xếp hàng đầu gối thay vì những gì nó phải là, unique...
Josh M.

56

Bạn có thể sử dụng phương thức lodash _.uniqWith, nó có sẵn trong phiên bản hiện tại của lodash 4.17.2.

Thí dụ:

var objects = [{ 'x': 1, 'y': 2 }, { 'x': 2, 'y': 1 }, { 'x': 1, 'y': 2 }];

_.uniqWith(objects, _.isEqual);
// => [{ 'x': 1, 'y': 2 }, { 'x': 2, 'y': 1 }]

Thông tin thêm: https://lodash.com/docs/#uniqWith


6
`let uniqObjects = _.uniqBy (docs, function (e) {return ex + ey;}); `Phương thức này sẽ nhanh hơn cho các mảng lớn với các đối tượng đơn giản
tagplus5

2
có nhưng bạn đã vượt qua một thuộc tính làm đối số đầu tiên với uniqBy, điều này không thuận tiện nếu bạn muốn nó duy nhất dựa trên một số thuộc tính mà bạn chưa biết
dbrrt 23/03/18

10

Hoặc đơn giản là sử dụng union , cho mảng đơn giản.

_.union([1,2,3,3], [3,5])

// [1,2,3,5]

1
Tôi thích câu trả lời này. Nó không phải là thứ dễ đọc nhất, nhưng nó thực sự hoạt động nếu bạn nghĩ về nó từ góc độ toán học. _.union([1, 2, 2, 1, 3]) => [1, 2, 3]
Sepehr

5

Chỉ cần sử dụng _.uniqBy () . Nó tạo ra phiên bản không có bản sao của một mảng.

Đây là một cách mới và có sẵn từ phiên bản 4.0.0.

_.uniqBy(data, 'id');

hoặc là

_.uniqBy(data, obj => obj.id);

4

Với phiên bản lodash 4+, bạn sẽ xóa các đối tượng trùng lặp bằng thuộc tính cụ thể hoặc toàn bộ đối tượng như vậy:

var users = [
  {id:1,name:'ted'},
  {id:1,name:'ted'},
  {id:1,name:'bob'},
  {id:3,name:'sara'}
];
var uniqueUsersByID = _.uniqBy(users,'id'); //removed if had duplicate id
var uniqueUsers = _.uniqWith(users, _.isEqual);//removed complete duplicates

Nguồn: https://www.codegrepper.com/?search_term=Lodash+remove+d repeatates + from + rarray



1

Đối với một mảng đơn giản, bạn có cách tiếp cận hợp nhất, nhưng bạn cũng có thể sử dụng:

_.uniq([2, 1, 2]);
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.