JS array убрать дубли

Рейтинг: 2Ответов: 9Опубликовано: 05.09.2014

Есть массив вида

['слово','слово ','новое слово',' новое слово','текст']

Нужно получить массив вида

['слово','новое слово','текст']

Т.е. некоторое элементы массив могут идти с пробелами как в начале так и в конце слова, нужно выполнить trim и убрать дубли из массива.

убираю дубли так

function onlyUnique(value, index, self) {
    return self.indexOf(value) === index;
}
var arr = tags.filter(onlyUnique);

Но из за того что в массиве второй элемент идет с пробелом в начале

'новое слово',' новое слово'

получаю один и тот же не профильтрованный массив

Ответы

▲ 5Принят

Из моих утилов:

getUnique = function (arr) {
    var i = 0,
    current,
    length = arr.length,
    unique = [];
    for (; i < length; i++) {
      current = arr[i];
      if (!~unique.indexOf(current)) {
        unique.push(current);
      }
    }
    return unique;
  };

Учтите, что эта функция не изменяет исходный массив, а возвращает новый.

▲ 5

UPD: Если данные кривые, а нужно отфильтровать и нормализовать, то forEach:

function getUniqTags(tags) {
    var results = [];

    tags.forEach(function (value) {
        value = value.trim();

        if (results.indexOf(value) === -1) {
            results.push(value);
        }
    });

    return results; 
}

console.log(getUniqTags([' слово', 'слово', '  новое слово', 'новое слово  ', 'текст  ']));
▲ 5
Array.from(new Set([1,2,3,4,5,5])) // [1,2,3,4,5]
[...new Set([1,2,3,4,5,5])]  // [1,2,3,4,5]
▲ 4

Простой метод:

const arr = ['слово','слово ','новое слово',' новое слово','текст'];

const sortArr = arr.filter((it, index) => index === arr.indexOf(it = it.trim()));

console.log(sortArr) // [ 'слово', 'новое слово', 'текст' ]
▲ 3

@RubaXa эм

var arr = tags.filter(function(value, index, self) {
    return self.indexOf(value.trim()) === index;
});

Обновил:

tags.filter(function(value, index, self) {
    return self.join("#,#").replace(/#\s*|\s*#/g, '').split(',').indexOf(value.trim()) === index;
}).map(function(value, index, self) {
    return value.trim();
});
▲ 3

Как вариант еще использовать reduce

function uniq (array) {
  return array.reduce((acc, current) => {
    current = current.trim();
    if (!acc.includes(current)) {
        acc.push(current);
    }
    return acc;
  }, []);
}

uniq(['слово','слово ','новое слово',' новое слово','текст']);
//["слово", "новое слово", "текст"]
▲ 2

Я использую underscore

▲ 2

Еще такой вариант можно использовать

var tagsTrim = tags.map(function (str) {
   return str.trim();
});

var filterTags = tagsTrim.filter(onlyUnique);

function onlyUnique(value, index, self) {
return self.indexOf(value) === index;
}

Тоже вроде работает =)

▲ 2
let arr = ['слово','слово ','новое слово',' новое слово','текст'];
let uniqArr = Array.from(new Set(arr.map(item=>item.trim())));