2017-02-20 2 views
1

Я пытаюсь удалить дубликаты в массиве в JavaScript. Данный массив являетсяУдалить дубликаты условно в массиве в JavaScript

array = [1,1,1,1,1,1,1,1,1,,1,2,2,2,2,2,2,2,2,3,3,3,3,3,3,3,1,1,1,1,1,2,2,2,2,2,2,2,2]

resultant_array = [1,2,3,1,2]

Здесь второй 1 не рассматривается как дубликат

ИЛИ

array = [1,1,1,1,1,1,1,1,1,1,1,1]

resultant_array = [1]

любые идеи, как я могу сделать это

+0

[Lodash 'uniq'] (https://lodash.com/docs/#uniq)? – tadman

+0

Что вы пытаетесь сделать? Удалить дубликаты, если и только если они последовательны? А что случилось с «22»? что ты уже испробовал? –

+0

Итак, вы хотите удалить последовательные дубликаты? 'resultant_array = array.join (", "). replace (/ ((?:^|,) ([^,] +)) (, \ 2 (? =, | $)) +/g," $ 1 ") .split (","); ' –

ответ

1

Вы можете использовать reduce так:

var array = [1,1,1,1,1,1,1,1,1,,1,2,2,2,2,2,2,2,2,3,3,3,3,3,3,3,1,1,1,1,1,2,2,2,2,2,2,22]; 
 

 
var result = array.reduce(function(r, e) { 
 
    if(r[r.length - 1] != e) // if the last element in the result is not equal to this item, then push it (note: if r is empty then r[-1] will be undefined so the item will be pushed as any number is != undefined) 
 
    r.push(e); 
 
    return r; 
 
}, []); 
 

 
console.log(result);

1
var arr = [1,1,2,2,3,3]; 
var obj = {}; 
for(var i in arr) { 
    obj[arr[i]] = true; 
} 
var result = []; 
for(var i in obj) { 
    result.push(i); 
} 

Я установил ключи от объекта в качестве значения массива и не может быть нескольких ключей с одинаковым значением. Затем я взял все ключи и положил их в результат.

+0

, это даст мне [1,2,3] во всех случаях ... даже если я прохожу [1,1,2,2,3,3,1,1,2,2,3,3]. Мне нужно [1,2,3,1,2,3] в этом случае – Mahima

+0

Возможно, это не ответило на вопрос OP, но это, безусловно, ответило мне. Спасибо! –

1

Вы можете проверить предшественника с Array#reduce

var array = [1, 1, 1, 1, 1, 1, 1, 1, 1, , 1, 2, 2, 2, 2, 2, 2, 2, 2, 3, 3, 3, 3, 3, 3, 3, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 2], 
 
    result = array.reduce(function (r, a) { 
 
     return r[r.length - 1] === a ? r : r.concat(a); 
 
    }, []); 
 
    
 
console.log(result);

Или использовать Array#filter и объект для последнего значения.

var array = [1, 1, 1, 1, 1, 1, 1, 1, 1, , 1, 2, 2, 2, 2, 2, 2, 2, 2, 3, 3, 3, 3, 3, 3, 3, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 2], 
 
    result = array.filter(function (a, i, aa) { 
 
     return this.last !== a && (this.last = a, true); 
 
    }, { last: undefined }); 
 
    
 
console.log(result);

+0

Спасибо. Это 22 опечатка. Я исправил это. Можете ли вы рассказать мне, как это работает? – Mahima

+0

'concat' кажется немного ресурсоемким, поскольку он создает новый массив каждый раз! –

+0

@ibrahimmahrir, вы можете использовать фильтр ... –

Смежные вопросы