2015-07-22 1 views
2

я могу удалить все дубликаты из массива с помощью этой функции:только возвращают элементы массива, которые выше в индексе, если дублируется

function make_unique(array) { 
    return array.reduce(function(p, c) { 
     if (p.indexOf(c) < 0) p.push(c); 
     return p; 
    }, []); 
}; 

Но это дает мне нижний индексированный элемент любых 2-х дублей. Мне нужен способ вернуть «более высокий» индексированный дубликат любых элементов, которые дублируются в массиве.

Таким образом, в следующем массиве:

array = ["bob", "chris", "susan", "steve", "melissa", "steve", "bob"] 

это дало бы мне элементы 1 (CHRIS), 2 (Susan), 4 (мелиссы), 5 (стив), 6 (боб)

ответ

5

Simpler "сделать уникальный" функции с помощью filter:

var uniques = array.filter(function(v,idx) { 
    return array.indexOf(v)===idx; 
}) 

Нужно ли фильтруется "с хвоста"? использовать lastIndexOf:

var uniques = array.filter(function(v,idx) { 
    return array.lastIndexOf(v)===idx; 
}); 

Но имейте в виду, что это не имеет никакого смысла: если вы удаления дубликатов, там нет различий между первой и последней инстанции, поэтому их упорядочение должно быть абсолютно никакого отношения ,

Если порядок имеет значения, то есть что-то вы не говорили нам, что очень важно в неоднозначности дубликатов, и вы должны поверхность, что в вашем коде (или отказаться от требования конечно)

+2

Вы могли бы избежать два операций обратных с помощью 'lastIndexOf'. 'array.filter (function (v, idx) {return array.lastIndexOf (v) === idx;});' – nikhil

+0

бонусные баллы для вас, позвольте мне изменить это. –

0

Как об использовании underscore.js Я думаю, вам не нужно создавать утилиты.

в underscore.js

var array = ["bob", "chris", "susan", "steve", "melissa", "steve", "bob"] 
var result = _.uniq(array.reverse()).reverse();