Làm cách nào để tìm các đối tượng duy nhất trong một mảng?

Set là một cấu trúc dữ liệu mới được giới thiệu trong ES6. Nó hơi giống với một mảng nhưng nó không cho phép chúng ta lưu trữ các giá trị trùng lặp

Để lọc các giá trị duy nhất, chúng tôi chuyển một mảng tới hàm tạo Set và chúng tôi đóng khung lại một mảng từ đối tượng Set bằng phương thức
Array.from.

Set hoạt động hoàn hảo với các loại chuỗi và số. Nhưng nó sẽ không hoạt động với các đối tượng tại sao?

Hãy xem ví dụ này

Mặc dù Tommy và Lucy được nhân đôi. Set không thể xác định chúng là trùng lặp

Hãy xem một ví dụ khác.


Điều này xảy ra bởi vì khi các đối tượng được so sánh, chúng được so sánh theo tham chiếu chứ không phải theo giá trị. Đó là lý do tại sao ban đầu khi lucy và tommy được thêm vào, chúng không được thêm vào vì chúng có cùng tham chiếu. Nhưng khi tôi thêm trực tiếp giá trị tommy thì nó sẽ tạo ra một tham chiếu mới.

2. Sử dụng Bộ lọc/Giảm

Chúng ta cũng có thể sử dụng Array.reduce để đạt được kết quả tương tự

Ở đây ý tưởng là phương thức findIndex hoặc indexOf sẽ trả về chỉ số của phần tử đầu tiên phù hợp với tiêu chí. Vì vậy, nếu chỉ mục của filter không bằng chỉ mục được trả về bởi findIndex thì phần tử này trùng lặp

Loại này sẽ hoạt động với tất cả các loại nhưng đối với mọi phần tử trong mảng, chúng ta phải lặp lại mảng. Hãy tưởng tượng nơi bạn muốn lọc hàng nghìn bản ghi. Cách tiếp cận này không hiệu quả O[n^2]

3. Cách tiếp cận cờ

Đây là cách yêu thích của tôi để tìm sự độc đáo, đặc biệt là khi xử lý một mảng lớn các đối tượng. Chúng tôi sẽ lặp qua mảng và trong đối tượng cờ, chúng tôi sẽ kiểm tra xem giá trị đã có chưa. Nếu không, chúng ta sẽ thêm giá trị vào đối tượng cờ và đẩy nó vào mảng khác, chúng ta sẽ bỏ qua nó. Trong phần này, chúng ta sẽ chỉ lặp qua mảng một lần nên độ phức tạp về thời gian sẽ là O[n]

Tôi có một mảng các đối tượng như var array =[ { "name". "Joe", "tuổi". 17,cờ. "đúng" },{ "tên". "Bob", "tuổi". 17, cờ. "đúng" },{ "tên". "Carl", "tuổi". 35,cờ. "sai"  },{ "tên". "Joe", "tuổi". 17,cờ. "ĐÚNG VẬY" }]

Tôi muốn tập hợp duy nhất các đối tượng như [ { "name". "Joe", "tuổi". 17,cờ. "đúng" },{ "tên". "Bob", "tuổi". 17, cờ. "đúng" },{ "tên". "Carl", "tuổi". 35,cờ. "sai" }]

Tôi đã thử sử dụng tập lệnh sau nhưng chức năng mũi tên không được hỗ trợ trong SNOW

var answer = [];

array.forEach[x => {
  if[!answer.some[y => JSON.stringify[y] === JSON.stringify[x]]]{
    answer.push[x]
  }
}]

Any alternative code to do this requirement in SNOW ?

Bạn đã bao giờ muốn lấy các phần tử riêng biệt từ một mảng chưa?

hình ảnh từ pexels Các phần tử riêng biệt của một mảng các giá trị nguyên thủy

Các giá trị nguyên thủy trong JavaScript là các giá trị bất biến trong tất cả các loại ngoại trừ các đối tượng. Các loại giá trị nguyên thủy bao gồm Boolean, Null, Undefined, Number, String và Symbol. Mảng giá trị nguyên thủy thường được sử dụng làm tùy chọn chọn và chúng tôi không muốn các giá trị tùy chọn trùng lặp. Ví dụ: chúng tôi có một mảng số đại diện cho năm tài chính

[
{ id: 3, name: 'Central Microscopy', fiscalYear: 2018 },
{ id: 5, name: 'Crystallography Facility', fiscalYear: 2018 },
{ id: 3, name: 'Central Microscopy', fiscalYear: 2017 },
{ id: 5, name: 'Crystallography Facility', fiscalYear: 2017 }
]
1 và chúng tôi muốn hiển thị tất cả các năm tài chính có sẵn [
[
{ id: 3, name: 'Central Microscopy', fiscalYear: 2018 },
{ id: 5, name: 'Crystallography Facility', fiscalYear: 2018 },
{ id: 3, name: 'Central Microscopy', fiscalYear: 2017 },
{ id: 5, name: 'Crystallography Facility', fiscalYear: 2017 }
]
2] để người dùng có thể chọn một giá trị để lọc dữ liệu. Trong kịch bản này, chúng ta cần lấy các phần tử riêng biệt từ mảng ban đầu

Câu hỏi StackOverflow này có câu trả lời có giá trị. Có hai cách phổ biến [tương ứng trong ES5 và ES6] để nhận các giá trị duy nhất trong các mảng giá trị nguyên thủy của JavaScript. Về cơ bản, trong ES5, trước tiên bạn xác định hàm gọi lại

[
{ id: 3, name: 'Central Microscopy', fiscalYear: 2018 },
{ id: 5, name: 'Crystallography Facility', fiscalYear: 2018 },
{ id: 3, name: 'Central Microscopy', fiscalYear: 2017 },
{ id: 5, name: 'Crystallography Facility', fiscalYear: 2017 }
]
3 để kiểm tra xem giá trị có xuất hiện lần đầu trong mảng ban đầu hay không, sau đó lọc mảng ban đầu để chỉ các phần tử xuất hiện đầu tiên được giữ lại

Trong ES6, mã đơn giản hơn nhiều. Đoạn mã bên dưới sử dụng đối tượng Set để lưu trữ một tập hợp các giá trị duy nhất, sau đó sử dụng toán tử trải rộng để tạo một mảng mới

Tuy nhiên, chúng ta cần hết sức cẩn thận rằng giải pháp trên chỉ hoạt động đối với các giá trị nguyên thủy. Nếu bạn có một mảng ngày, thì bạn cần một số phương thức tùy chỉnh hơn. Ảnh chụp màn hình bên dưới cho thấy rằng Set có thể không hoạt động như bạn mong đợi vì

[
{ id: 3, name: 'Central Microscopy', fiscalYear: 2018 },
{ id: 5, name: 'Crystallography Facility', fiscalYear: 2018 },
{ id: 3, name: 'Central Microscopy', fiscalYear: 2017 },
{ id: 5, name: 'Crystallography Facility', fiscalYear: 2017 }
]
5 so sánh các đối tượng theo tham chiếu

Các giá trị thuộc tính riêng biệt của một mảng các đối tượng

Rất thường xuyên, mảng mà chúng ta đang xử lý bao gồm các đối tượng JSON được lấy từ phía máy chủ. Bây giờ, chúng tôi muốn lấy các giá trị riêng biệt của một thuộc tính nhất định từ mảng đối tượng. Ví dụ: mảng là

[
{ id: 3, name: 'Central Microscopy', fiscalYear: 2018 },
{ id: 5, name: 'Crystallography Facility', fiscalYear: 2018 },
{ id: 3, name: 'Central Microscopy', fiscalYear: 2017 },
{ id: 5, name: 'Crystallography Facility', fiscalYear: 2017 }
]
6 và chúng tôi muốn lấy các độ tuổi khác nhau từ mảng

Giải pháp thực sự rất dễ dàng. Trước tiên, chúng tôi ánh xạ mảng thành một mảng mới chỉ chứa các giá trị nguyên thủy, sau đó chúng tôi có thể sử dụng các giải pháp trên. Ảnh chụp màn hình bên dưới hiển thị một ví dụ

Các đối tượng khác biệt theo giá trị thuộc tính từ một mảng các đối tượng

Đôi khi chúng ta muốn lấy một mảng các đối tượng riêng biệt theo giá trị thuộc tính từ mảng ban đầu. Ví dụ chúng ta có một mảng đối tượng như bên dưới. Đối với mỗi đối tượng, các thuộc tính

[
{ id: 3, name: 'Central Microscopy', fiscalYear: 2018 },
{ id: 5, name: 'Crystallography Facility', fiscalYear: 2018 },
{ id: 3, name: 'Central Microscopy', fiscalYear: 2017 },
{ id: 5, name: 'Crystallography Facility', fiscalYear: 2017 }
]
7 và
[
{ id: 3, name: 'Central Microscopy', fiscalYear: 2018 },
{ id: 5, name: 'Crystallography Facility', fiscalYear: 2018 },
{ id: 3, name: 'Central Microscopy', fiscalYear: 2017 },
{ id: 5, name: 'Crystallography Facility', fiscalYear: 2017 }
]
8 nằm trong 1. 1 mối quan hệ

[
{ id: 3, name: 'Central Microscopy', fiscalYear: 2018 },
{ id: 5, name: 'Crystallography Facility', fiscalYear: 2018 },
{ id: 3, name: 'Central Microscopy', fiscalYear: 2017 },
{ id: 5, name: 'Crystallography Facility', fiscalYear: 2017 }
]

Chúng tôi muốn có được một mảng các đối tượng có cả thuộc tính

[
{ id: 3, name: 'Central Microscopy', fiscalYear: 2018 },
{ id: 5, name: 'Crystallography Facility', fiscalYear: 2018 },
{ id: 3, name: 'Central Microscopy', fiscalYear: 2017 },
{ id: 5, name: 'Crystallography Facility', fiscalYear: 2017 }
]
7 và
[
{ id: 3, name: 'Central Microscopy', fiscalYear: 2018 },
{ id: 5, name: 'Crystallography Facility', fiscalYear: 2018 },
{ id: 3, name: 'Central Microscopy', fiscalYear: 2017 },
{ id: 5, name: 'Crystallography Facility', fiscalYear: 2017 }
]
8 vì các tùy chọn được chọn hiển thị tốt hơn ở định dạng của
const array = [
{ id: 3, name: 'Central Microscopy', fiscalYear: 2018 },
{ id: 5, name: 'Crystallography Facility', fiscalYear: 2018 },
{ id: 3, name: 'Central Microscopy', fiscalYear: 2017 },
{ id: 5, name: 'Crystallography Facility', fiscalYear: 2017 }
];
const result = [];
const map = new Map[];
for [const item of array] {
if[!map.has[item.id]]{
map.set[item.id, true]; // set any value to Map
result.push[{
id: item.id,
name: item.name
}];
}
}
console.log[result]
2 so với chỉ ở định dạng của
[
{ id: 3, name: 'Central Microscopy', fiscalYear: 2018 },
{ id: 5, name: 'Crystallography Facility', fiscalYear: 2018 },
{ id: 3, name: 'Central Microscopy', fiscalYear: 2017 },
{ id: 5, name: 'Crystallography Facility', fiscalYear: 2017 }
]
7 hoặc
[
{ id: 3, name: 'Central Microscopy', fiscalYear: 2018 },
{ id: 5, name: 'Crystallography Facility', fiscalYear: 2018 },
{ id: 3, name: 'Central Microscopy', fiscalYear: 2017 },
{ id: 5, name: 'Crystallography Facility', fiscalYear: 2017 }
]
8

Điều này có thể được thực hiện trong hai bước. đầu tiên, chúng tôi tạo ra một mảng gồm các

[
{ id: 3, name: 'Central Microscopy', fiscalYear: 2018 },
{ id: 5, name: 'Crystallography Facility', fiscalYear: 2018 },
{ id: 3, name: 'Central Microscopy', fiscalYear: 2017 },
{ id: 5, name: 'Crystallography Facility', fiscalYear: 2017 }
]
7 riêng biệt; . Đoạn mã như sau

Tuy nhiên, phương pháp trên không hiệu quả nếu bạn có một mảng lớn? . Ví dụ,

const array = [
{ id: 3, name: 'Central Microscopy', fiscalYear: 2018 },
{ id: 5, name: 'Crystallography Facility', fiscalYear: 2018 },
{ id: 3, name: 'Central Microscopy', fiscalYear: 2017 },
{ id: 5, name: 'Crystallography Facility', fiscalYear: 2017 }
];
const result = [];
const map = new Map[];
for [const item of array] {
if[!map.has[item.id]]{
map.set[item.id, true]; // set any value to Map
result.push[{
id: item.id,
name: item.name
}];
}
}
console.log[result]

Hi vọng điêu nay co ich. Cảm ơn vì đã đọc

✉️ Đăng ký Email Blast hàng tuần một lần của CodeBurst, 🐦 Theo dõi CodeBurst trên Twitter, xem 🗺️ Lộ trình dành cho nhà phát triển web năm 2018 và 🕸️ Tìm hiểu về phát triển web Full Stack

Làm cách nào để tìm đối tượng duy nhất trong JavaScript?

Sử dụng Set để tìm các đối tượng duy nhất . Tuy nhiên, Set hoạt động khác với các giá trị nguyên thủy so với khi làm việc với các đối tượng JavaScript.

Làm cách nào để tìm các phần tử duy nhất trong mảng js?

Sử dụng EcmaScript 2016 bạn chỉ cần làm như thế này. var arr = ["a", "a", "b"]; . from[new Set[arr]]; . Sets are always unique, and using Array.

Chủ Đề