2012-03-17 2 views
3

Можно создать дубликат:
Easiest way to find duplicate values in a JavaScript array
Javascript array sort and uniqueУдаление дубликатов элементов в массиве

У меня есть следующий массив

var output = new array(7); 
    output[0]="Rose"; 
    output[1]="India"; 
    output[2]="Technologies"; 
    output[3]="Rose"; 
    output[4]="Ltd"; 
    output[5]="India"; 
    output[6]="Rose"; 

Как я могу удалить дубликаты элементов в над массивом. Есть ли какой-либо метод чтобы сделать это?

+0

Что вы пробовали? Нет никакой функции, доступной изначально, но писать ее не очень сложно. – Halcyon

+0

Это уже было задано. Http://stackoverflow.com/questions/2218999/remove-duplicates-from-an-array-of-objects-in-javascript И решение там действительно умное и хорошее. – prasann

+0

i { if (sorted_arr [i + 1] == sorted_arr [i]) { results.push (sorted_arr [i]); } } – vishnu

ответ

9

Вы можете написать функцию, как этот

function eliminateDuplicates(arr) { 
var i, 
    len=arr.length, 
    out=[], 
    obj={}; 

for (i=0;i<len;i++) { 
obj[arr[i]]=0; 
} 
for (i in obj) { 
out.push(i); 
} 
return out; 
}` 

Проверьте это here

1

Прежде всего, вы должны использовать литерал массива (var output = []), чтобы объявить массив. Во-вторых, вам нужно выполнить цикл через массив и сохранить все значения во втором массиве. Если любое значение в первом массиве соответствует значению во втором массиве, удалите его и продолжите цикл.

Ваш код будет выглядеть следующим образом:

var output = [ 
    "Rose", 
    "India", 
    "Technologies", 
    "Rose", 
    "Ltd", 
    "India", 
    "Rose" 
] 

var doubledOutput = []; 

for(var i = 0; i < output.length; i++) { 
    var valueIsInArray = false; 

    for(var j = 0; j < doubledOutput.length; j++) { 
     if(doubledOutput[j] == output[i]) { 
      valueIsInArray = true; 
     } 
    } 

    if(valueIsInArray) { 
     output.splice(i--, 1); 
    } else { 
     doubledOutput.push(output[i]); 
    } 
} 

Пожалуйста, обратите внимание, что приведенный выше код не тестировался и может содержать ошибки.

+0

Могу ли я спросить причину необъяснимого понижения? Это простой, понятный и простой способ найти повторяющиеся значения для новичка в Javascript, которому явно не нужно сложное и перегруженное решение. –

+0

Я не спустил вниз, но вы оба увеличиваете количество элементов 'i' * и *. Вы будете пропускать элементы таким образом, если вы не уменьшите «i» колодец при сращивании элемента. – pimvdb

+0

Ой, да, я должен был использовать обратную петлю. Мой плохой, спасибо за улов. –

3

Может быть более сложным, чем нужно, но:

function array_unique (inputArr) { 
    // Removes duplicate values from array 
    var key = '', 
     tmp_arr2 = {}, 
     val = ''; 

    var __array_search = function (needle, haystack) { 
     var fkey = ''; 
     for (fkey in haystack) { 
      if (haystack.hasOwnProperty(fkey)) { 
       if ((haystack[fkey] + '') === (needle + '')) { 
        return fkey; 
       } 
      } 
     } 
     return false; 
    }; 

    for (key in inputArr) { 
     if (inputArr.hasOwnProperty(key)) { 
      val = inputArr[key]; 
      if (false === __array_search(val, tmp_arr2)) { 
       tmp_arr2[key] = val; 
      } 
     } 
    } 

    return tmp_arr2; 
} 

Код взят из: http://phpjs.org/functions/array_unique:346

+1

Вы не думаете, что может быть * бит * слишком сложный для OP? Очевидно, он просто попадает в Javascript. Опять же, он мог просто скопировать-вставить и позволить волшебной функции сделать свой трюк, но это не очень полезно или в духе хорошего обучения ... –

+0

Это сложная задача, если вы только начинаете. Я предположил, что ему нужно решение для копирования пасты. – nathanjosiah

1

Вы можете удалить Dups из массива, используя временный хэш-таблицу (с помощью JavaScript Object), чтобы сохранить отслеживать, какие изображения вы уже видели в массиве. Это работает для значений массива, которые могут быть однозначно представлены в виде строки (строки или числа в основном), но не для объектов.

function removeDups(array) { 
    var index = {}; 
    // traverse array from end to start 
    // so removing the current item from the array 
    // doesn't mess up the traversal 
    for (var i = array.length - 1; i >= 0; i--) { 
     if (array[i] in index) { 
      // remove this item 
      array.splice(i, 1); 
     } else { 
      // add this value to index 
      index[array[i]] = true; 
     } 
    } 
} 

Вот рабочий пример: http://jsfiddle.net/jfriend00/sVT7g/

Для значительных массивов, используя объект как временный индекс будет во много раз быстрее, чем линейный поиск в массиве.

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