#javascript #arrays #duplicates
#javascript #массивы #дубликаты
Вопрос:
Как полностью удалить повторяющиеся числа из массива?
Например, если:
const array = [1, 1, 2, 3, 1, 2, 5]
Вывод должен быть:
[3, 5]
Комментарии:
1. Если это отсортированный массив, это можно сделать в O (1) сложности пространства. Иначе вам нужно взять набор для проверки элементов
Ответ №1:
Вы можете использовать объект для отслеживания просмотренных элементов, взяв массив со значением или установив значение массива равным нулю.
Наконец, выровняйте результирующий набор, чтобы удалить пустые массивы.
const
array = [1, 1, 2, 3, 1, 2, 5],
result = array
.reduce((o => (r, v) => {
if (v in o) o[v].length = 0;
else r.push(o[v] = [v]);
return r;
})({}), [])
.flat();
console.log(result);
Комментарии:
1. Это умный подход, для него не нужно выполнять подсчет явно.
Ответ №2:
Roko и Ke1vans ответили функциональными подходами. Оба они верны. Тем не менее, я бы показал ответ в императивном подходе, который может показаться более простым для новичка.
Аналогично их потоку. Сначала мы подсчитываем вхождение каждого числа. Затем мы выбираем числа, которые произошли один раз (следовательно, не повторяются), в выходной массив.
let array = [1,1,2,3,1,2,5]
let counts = {}
let output = []
// loop each elements in the array as `item`
for(let item of array) {
// If the item is not set in the counts, `counts[item]` will be `undefined`.
// Using `|| 0` means use zero as fallback value if the items is unseen.
let count = counts[item] || 0
counts[item] = count 1
}
// loop each keys in the object (key-value pairs) as `item`
for(let item in counts) {
let count = counts[item]
if(count == 1) {
// ` item` converts the key from string into number
output.push( item)
}
}
console.log(output) // will print out `[ 3, 5 ]`
Ответ №3:
Вы можете выполнять итерации и создавать карту значений. позже выполните итерацию и отфильтруйте.
const data = [1, 1, 2, 3, 1, 2, 5];
const findUniques = (data = []) => {
const map = data.reduce((m, num) => {
m[num] = (m[num] || 0) 1;
return m;
}, {});
return data.filter((num) => map[num] === 1);
};
console.log(findUniques(data));
Вы также можете сделать то же самое, используя 2 set или 2 array .
const data = [1, 1, 2, 3, 1, 2, 5];
const findUniques2 = (data = []) => {
let unique = new Set();
let seen = new Set();
for (let num of data) {
if (seen.has(num)) unique.delete(num);
else unique.add(num);
seen.add(num);
}
return Array.from(unique);
};
console.log(findUniques2(data));
Ответ №4:
Используйте объект, где ключом является число, а значением — количество вхождений. Чем уменьшить его обратно до нужного массива значений:
const arr = [1,1,2,3,1,2,5];
const res = Object.entries(arr.reduce((ob, v) => {
if (!(v in ob)) ob[v] = 0;
ob[v] = 1; // Count occurrences
return ob;
}, {})).reduce((arr, [k, v]) => { // Reduce back to Array
if (v === 1) arr.push( k); // Only keys with 1 occurrence
return arr;
}, []);
console.log(res); // [3, 5]
Ответ №5:
Вы можете использовать Array.filter() (статья Array filter) для этого
, например :
const a = [ 1 , 1 , 2 , 3 , 2 , 4 , 5 , 7];
function filter(value , index , array){
// looping through all the objects in the array
for(let i=0; i<array.length; i ) {
if(i != index amp;amp; array[i] == value) return false; // return 'false' if the value has a duplicate other than itself
}
// return 'TRUE' if value hasn't been duplicated
return true;
}
const b = a.filter(filter); // [3, 4, 5, 7]
И короткая версия, если эта функция будет использоваться только один раз:
const a = [ 1 , 1 , 2 , 3 , 2 , 4 , 5 , 7];
const b = a.filter((value , index , array) => {
for(let i=0; i<array.length; i ) if(i != index amp;amp; array[i] == value) return false;
return true;
});
// [3, 4, 5, 7]
Ответ №6:
Вы могли бы найти дубликаты, а затем обработать разницу.
let a = [1,1,2,3,1,2,5];
const findDuplicates = (nums) => {
nums.sort(); // alters original array
let ans = []
for(let i = 0; i< nums.length; i ){
if(nums[i] === nums[i 1]){
if(ans[ans.length -1] !== nums[i]){
ans.push(nums[i])
}
}
}
return ans;
}
duplicates = new Set(findDuplicates(a))
let difference = new Set([...a].filter(x => !duplicates.has(x)))
console.log(Array.from(difference))
вывод: [ 3, 5]
Примечание: я беру функцию findDuplicates по этой ссылке
Ответ №7:
const data = [1, 1, 2, 3, 1, 2, 5];
const s = new Set();
const res = data.filter((a, i) => {
if (data.lastIndexOf(a) > i || s.has(a)) {
s.add(a);
return false;
}
return true;
});
console.log(res); //=> [3, 5]