2013-08-02 2 views
15

Я ищу простой способ удаления повторяющегося значения из массива. Я выяснил, как определить, есть ли дубликат или нет, просто я не знаю, как «оттолкнуть» его от значения. Например, если вы перейдете к предоставленной ссылке, а затем введите «abca» (нажмите клавишу «возврат/ввод» после каждой буквы) .. он будет предупреждать «дублировать!».Удалить дублирующийся элемент из массива Javascript

Но я также хочу выяснить, как удалить этот дубликат из текстового поля?

http://jsfiddle.net/P3gpp/

Это та часть, которая, кажется, не работает ::

sort = sort.push(i); 
textVal = sort; 
return textVal; 

ответ

49

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

var arr = ["apple", "bannana", "orange", "apple", "orange"]; 

arr = arr.filter(function(item, index, inputArray) { 
      return inputArray.indexOf(item) == index; 
    }); 


--------------------- 
Output: ["apple", "bannana", "orange"] 
+4

Я думаю, что в 2014 году, через пять лет в эпоху EcmaScript 5 и с IE8 ниже 10% доли мирового браузера, мы можем смело называть это правильным ответом. Если речь идет о поддержке старых версий IE, можно использовать библиотеку polyfill для EC5. – Semicolon

+1

(я бы заметил, хотя в то время как «фильтр» является правильным ответом в 90% случаев, он не подходит сам по себе в обстоятельствах, когда могут быть ссылки на исходный массив в другом месте, поскольку он создает новый массив и оригинал объект массива остается нетронутым.) – Semicolon

4

Эти функции я создал/использование для удаления дубликатов:

var removeDuplicatesInPlace = function (arr) { 
    var i, j, cur, found; 
    for (i = arr.length - 1; i >= 0; i--) { 
     cur = arr[i]; 
     found = false; 
     for (j = i - 1; !found && j >= 0; j--) { 
      if (cur === arr[j]) { 
       if (i !== j) { 
        arr.splice(i, 1); 
       } 
       found = true; 
      } 
     } 
    } 
    return arr; 
}; 

var removeDuplicatesGetCopy = function (arr) { 
    var ret, len, i, j, cur, found; 
    ret = []; 
    len = arr.length; 
    for (i = 0; i < len; i++) { 
     cur = arr[i]; 
     found = false; 
     for (j = 0; !found && (j < len); j++) { 
      if (cur === arr[j]) { 
       if (i === j) { 
        ret.push(cur); 
       } 
       found = true; 
      } 
     } 
    } 
    return ret; 
}; 

Так, используя первый, вот как выглядел бы ваш код:

function cleanUp() { 
    var text = document.getElementById("fld"), 
     textVal = text.value, 
     array; 

    textVal = textVal.replace(/\r/g, " "); 
    array = textVal.split(/\n/g); 

    text.value = removeDuplicatesInPlace(array).join("\n"); 
} 

DEMO:http://jsfiddle.net/VrcN6/1/

+1

спасибо. Это работает очень хорошо! – Matthew

1

Вы можете легко сделать это с помощью всего объекта:

function removeDuplicates(text) { 
    var seen = {}; 
    var result = ''; 

    for (var i = 0; i < text.length; i++) { 
     var char = text.charAt(i); 

     if (char in seen) { 
      continue; 
     } else { 
      seen[char] = true; 
      result += char; 
     } 
    } 

    return result; 
} 

function cleanUp() { 
    var elem = document.getElementById("fld"); 

    elem.value = removeDuplicates(elem.value); 
} 
+0

Рассмотрите: 'результат + = символ в замеченном? ': see [char] = char; ' – RobG

2

Вы можете использовать Array.reduce() для удаления дубликатов. Вам нужен вспомогательный объект, чтобы отслеживать, сколько раз элемент был замечен.

function cleanUp() 
{ 
    var textBox = document.getElementById("fld"), 
    array = textBox.value.split(/\r?\n/g), 
    o = {}, 
    output; 

    output = array.reduce(function(prev, current) { 
     var key = '$' + current; 

     // have we seen this value before? 
     if (o[key] === void 0) { 
      prev.push(current); 
      o[key] = true; 
     } 

     return prev; 
    }, []); 

    // write back the result 
    textBox.value = output.join("\n"); 
} 

Выход reduce() шага может быть использован непосредственно снова заселить область текста, не затрагивая исходный порядок сортировки.

Demo

0
 arr3 = [1, 2, 3, 2, 4, 5]; 

     unique = []; 

    function findUnique(val) 
    { 
    status = '0'; 
    unique.forEach(function(itm){ 

     if(itm==val) 
     { 
     status=1; 
     } 

       }) 
return status; 
} 

arr3.forEach(function(itm){ 

    rtn = findUnique(itm); 
    if(rtn==0) 
    unique.push(itm); 


    }); 

    console.log(unique); // [1, 2, 3, 4, 5] 
4

основе user2668376 решения, это вернет новый массив без дубликатов.

Array.prototype.removeDuplicates = function() { 
    return this.filter(function (item, index, self) { 
     return self.indexOf(item) == index; 
    }); 
}; 

После того, что вы можете сделать:

[1, 3, 3, 7].removeDuplicates(); 

Результат будет; [1, 3, 7].

+0

Итак, если пользователь2668376 уже ответил этим решением, зачем его повторять? Кстати, у вас слишком много «себя». – Bergi

+1

Его решение без .prototype. По-моему, гораздо лучше использовать это. Я удалил var self = this; –

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