Hướng dẫn get duplicate value in array javascript - nhận giá trị trùng lặp trong mảng javascript

Cập nhật: ngắn một lớp để có được các bản sao:

[1, 2, 2, 4, 3, 4].filter((e, i, a) => a.indexOf(e) !== i) // [2, 4]

Để có được mảng mà không sao chép đơn giản là đảo ngược tình trạng:

[1, 2, 2, 4, 3, 4].filter((e, i, a) => a.indexOf(e) === i) // [1, 2, 3, 4]

Lưu ý rằng mục tiêu chính của câu trả lời này là ngắn gọn. Nếu bạn cần một cái gì đó biểu diễn cho một mảng lớn, một giải pháp khả thi là sắp xếp mảng của bạn trước (nếu nó có thể sắp xếp) thì hãy làm như sau để có được loại kết quả tương tự như trên:

myHugeSortedArray.filter((e, i, a) => a[i-1] === e)

Dưới đây là một ví dụ cho mảng 1 000 000 số nguyên:

const myHugeIntArrayWithDuplicates =
  [...Array(1_000_000).keys()]
  // adding two 0 and four 9 duplicates
  .fill(0, 2, 4).fill(9, 10, 14)

console.time("time")
console.log(
  myHugeIntArrayWithDuplicates
  // a possible sorting method for integers
  .sort((a, b) => a > b ? 1 : -1)
  .filter((e, i, a) => a[i-1] === e)
)
console.timeEnd("time")

Trên máy phát hành AMD Ryzen 7 5700G của tôi, nó xuất hiện:

[ 0, 0, 9, 9, 9, 9 ]
time: 22.738ms

Như đã chỉ ra trong các bình luận, cả giải pháp ngắn và giải pháp biểu diễn sẽ trả về một mảng với nhiều lần trùng lặp nếu nó xảy ra nhiều lần trong mảng gốc:

[1, 1, 1, 2, 2, 2, 2].filter((e, i, a) => a.indexOf(e) !== i) // [1, 1, 2, 2, 2]

Nếu các bản sao duy nhất được muốn thì một chức năng như

const f = arr => [...new Set(arr.filter((e, i, a) => a.indexOf(e) !== i))]

có thể được sử dụng để

[1, 2, 2, 4, 3, 4].filter((e, i, a) => a.indexOf(e) === i) // [1, 2, 3, 4]
6 trả về
[1, 2, 2, 4, 3, 4].filter((e, i, a) => a.indexOf(e) === i) // [1, 2, 3, 4]
7.


Khi tất cả những gì bạn cần là kiểm tra xem không có bản sao nào được hỏi trong câu hỏi này, bạn có thể sử dụng phương pháp

[1, 2, 2, 4, 3, 4].filter((e, i, a) => a.indexOf(e) === i) // [1, 2, 3, 4]
8:

[1, 2, 3].every((e, i, a) => a.indexOf(e) === i) // true

[1, 2, 1].every((e, i, a) => a.indexOf(e) === i) // false

Lưu ý rằng

[1, 2, 2, 4, 3, 4].filter((e, i, a) => a.indexOf(e) === i) // [1, 2, 3, 4]
8 không hoạt động cho IE 8 trở xuống.

Có nhiều phương thức có sẵn để kiểm tra xem một mảng có chứa các giá trị trùng lặp trong JavaScript không. Bạn có thể sử dụng phương thức

myHugeSortedArray.filter((e, i, a) => a[i-1] === e)
0, đối tượng
myHugeSortedArray.filter((e, i, a) => a[i-1] === e)
1 hoặc lần lặp để xác định các mục lặp lại trong một mảng.

Đối tượng myHugeSortedArray.filter((e, i, a) => a[i-1] === e) 1

Set là một cấu trúc dữ liệu đặc biệt được giới thiệu trong ES6 lưu trữ một tập hợp các giá trị duy nhất. Vì mỗi giá trị trong một

myHugeSortedArray.filter((e, i, a) => a[i-1] === e)
1 phải là duy nhất, nên việc vượt qua bất kỳ mục trùng lặp nào sẽ được xóa tự động:

const numbers = [1, 2, 3, 2, 4, 5, 5, 6];

const unique = Array.from(new Set(numbers));

console.log(unique);
// [ 1, 2, 3, 4, 5, 6 ]

Phương thức mảng.from (), chúng tôi đã sử dụng ở trên, chuyển đổi

myHugeSortedArray.filter((e, i, a) => a[i-1] === e)
1 trở lại một mảng. Điều này là bắt buộc vì
myHugeSortedArray.filter((e, i, a) => a[i-1] === e)
1 không phải là một mảng. Bạn cũng có thể sử dụng toán tử lây lan nếu bạn muốn chuyển đổi:

const unique = [...new Set(numbers)];

Để kiểm tra xem có các mục trùng lặp trong mảng ban đầu không, chỉ cần so sánh độ dài của cả hai mảng:check if there were duplicate items in the original array, just compare the length of both arrays:

[1, 2, 2, 4, 3, 4].filter((e, i, a) => a.indexOf(e) === i) // [1, 2, 3, 4]
0

Để tìm hiểu chính xác các yếu tố nào là trùng lặp, bạn có thể sử dụng mảng

myHugeSortedArray.filter((e, i, a) => a[i-1] === e)
6 ở trên và xóa từng mục khỏi mảng gốc như được hiển thị bên dưới:find out exactly which elements are duplicates, you could make use of the
myHugeSortedArray.filter((e, i, a) => a[i-1] === e)
6 array above, and remove each item from the original array as shown below:

[1, 2, 2, 4, 3, 4].filter((e, i, a) => a.indexOf(e) === i) // [1, 2, 3, 4]
1

Phương pháp myHugeSortedArray.filter((e, i, a) => a[i-1] === e) 0

Trong phương pháp này, chúng tôi so sánh chỉ số của lần xuất hiện đầu tiên của một phần tử với tất cả các phần tử trong một mảng. Nếu chúng không khớp, nó ngụ ý rằng phần tử là một bản sao:

[1, 2, 2, 4, 3, 4].filter((e, i, a) => a.indexOf(e) === i) // [1, 2, 3, 4]
2

Giải pháp trên hoạt động hoàn hảo miễn là bạn chỉ muốn kiểm tra xem mảng có chứa các mục lặp lại không. Tuy nhiên, mảng đầu ra có thể chứa các mục trùng lặp nếu các mục đó xảy ra nhiều hơn hai lần trong mảng:

[1, 2, 2, 4, 3, 4].filter((e, i, a) => a.indexOf(e) === i) // [1, 2, 3, 4]
3

Phương pháp myHugeSortedArray.filter((e, i, a) => a[i-1] === e) 8

Trong JavaScript, phương thức

myHugeSortedArray.filter((e, i, a) => a[i-1] === e)
8 trả về
const myHugeIntArrayWithDuplicates =
  [...Array(1_000_000).keys()]
  // adding two 0 and four 9 duplicates
  .fill(0, 2, 4).fill(9, 10, 14)

console.time("time")
console.log(
  myHugeIntArrayWithDuplicates
  // a possible sorting method for integers
  .sort((a, b) => a > b ? 1 : -1)
  .filter((e, i, a) => a[i-1] === e)
)
console.timeEnd("time")
0 nếu một hoặc nhiều phần tử vượt qua một điều kiện nhất định.

Giống như phương pháp

const myHugeIntArrayWithDuplicates =
  [...Array(1_000_000).keys()]
  // adding two 0 and four 9 duplicates
  .fill(0, 2, 4).fill(9, 10, 14)

console.time("time")
console.log(
  myHugeIntArrayWithDuplicates
  // a possible sorting method for integers
  .sort((a, b) => a > b ? 1 : -1)
  .filter((e, i, a) => a[i-1] === e)
)
console.timeEnd("time")
1, phương pháp
myHugeSortedArray.filter((e, i, a) => a[i-1] === e)
8 lặp lại trên tất cả các phần tử trong một mảng để đánh giá điều kiện đã cho.

Trong chức năng gọi lại, chúng tôi một lần nữa sử dụng phương thức

myHugeSortedArray.filter((e, i, a) => a[i-1] === e)
0 để so sánh chỉ mục phần tử hiện tại với các phần tử khác trong mảng.Nếu cả hai chỉ mục đều giống nhau, điều đó có nghĩa là mục hiện tại không được trùng lặp:

[1, 2, 2, 4, 3, 4].filter((e, i, a) => a.indexOf(e) === i) // [1, 2, 3, 4]
4

const myHugeIntArrayWithDuplicates = [...Array(1_000_000).keys()] // adding two 0 and four 9 duplicates .fill(0, 2, 4).fill(9, 10, 14) console.time("time") console.log( myHugeIntArrayWithDuplicates // a possible sorting method for integers .sort((a, b) => a > b ? 1 : -1) .filter((e, i, a) => a[i-1] === e) ) console.timeEnd("time") 4 Vòng lặp

Cuối cùng, phương pháp cuối cùng để tìm bản sao trong một mảng là sử dụng vòng lặp

const myHugeIntArrayWithDuplicates =
  [...Array(1_000_000).keys()]
  // adding two 0 and four 9 duplicates
  .fill(0, 2, 4).fill(9, 10, 14)

console.time("time")
console.log(
  myHugeIntArrayWithDuplicates
  // a possible sorting method for integers
  .sort((a, b) => a > b ? 1 : -1)
  .filter((e, i, a) => a[i-1] === e)
)
console.timeEnd("time")
4.

Dưới đây là một ví dụ so sánh từng phần tử của mảng với tất cả các phần tử khác của mảng để kiểm tra xem hai giá trị có giống nhau bằng cách sử dụng Nested Loop không:

[1, 2, 2, 4, 3, 4].filter((e, i, a) => a.indexOf(e) === i) // [1, 2, 3, 4]
5

Thích bài viết này?Theo dõi tôi trên Twitter và LinkedIn.Bạn cũng có thể đăng ký nguồn cấp dữ liệu RSS. Follow me on Twitter and LinkedIn. You can also subscribe to RSS Feed.