在陣列中找出重複與不重複的元素


Posted by backas36 on 2021-07-29

原陣列

let data = [1,'a',2,'b',2,'a','c',3]

把重複的元素拿掉,讓重複的元素只出現在陣列一次

例如想要取出 : [1, 'a', 2, 'b', 'c', 3]

方式 1 => filter 與 indexOf

let result = data.filter((el, index) => {
  return data.indexOf(el) === index
})

console.log(result)

indexOf 會回傳陣列中第一個被找到的元素 index,如果找不到回傳 -1。
index 為回傳目前 el 的 index。
例如當 el 為 第二次出現的 2 時,index 為 4, data.indexOf(2) 為 2,這樣 result 就不會篩選到。

方式 2 => Set

let dataSet = new Set(data)
console.log([...dataSet])

Set 會儲存不重複的值。
如果你直接 console.log(dataSet)
會得到 Set(6) { 1, 'a', 2, 'b', 'c', 3 },並不是陣列的形式。
所以必須使用 [...dataSet]


列出有重複過的元素陣列

原陣列

let data = [1,'a',2,'b',2,'a','c',3]

想要取出重複過的元素陣列 [2, 'a']

方式1 => filter, indexOf

let result = data.filter((el, index) => {
  return data.indexOf(el) !== index
})

console.log(result)

跟上面找出不重複的方式差不多只不過 === 改成 !==

方式2 => Set, forEach

let dataSet = new Set()
let result = []
data.forEach(el => {
  dataSet.has(el)? result.push(el):dataSet.add(el)
})

console.log(result)

新建一個 Set,準備裝不重複的值。
使用 forEach ,找 data 裡面的每一個元素,如果 dataSet 沒有這個元素就新增一個到 dataSet;如果有,代表重複了,把它 push 到 result。


那如果想要列出沒有重過的元素呢

原陣列

let data = [1,'a',2,'b',2,'a','c',3]

想要取出沒有重複過的元素陣列 [1, 'b', 'c', 3]

方式1 indexOf, filter

let repeat = data.filter((el, index) => {
  return data.indexOf(el) !== index
})

let result = data.filter(el => {
  return repeat.indexOf(el) === -1
})

console.log(result)

方式2 includes, filter

let repeat = data.filter((el, index) => {
  return data.indexOf(el) !== index
})

let result = data.filter(el => {
  return !repeat.includes(el) 
})

console.log(result)

以上是目前我想到的方式,如果日後有不錯的解法,會再慢慢更新上來!


#js #Array #object







Related Posts

在 mac OS 安裝 Laravel 簡單筆記

在 mac OS 安裝 Laravel 簡單筆記

DAY 01 : 資料結構緒論

DAY 01 : 資料結構緒論

Angular 專案使用 Font Awesome Free Icon

Angular 專案使用 Font Awesome Free Icon


Comments