Javascript: поиск в массиве для обманщиков - PullRequest
0 голосов
/ 06 января 2012

Это то, что я пытаюсь сделать: я предоставляю пользователю текстовую область, и он должен войти в некоторые домены, если он входит в один и тот же домен дважды (дубликат), я хочу удалить дубликаты.

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

function check_if_already_in_the_list___manual_textbox()
{

var therows=0;
var thetext = document.forms[0].text.value;
var newtext = thetext.split("\n");
therows+=newtext.length;
var i;
var match_counter=0;

    for(i=0;i<newtext.length;i++) // first iterate over the number of items
    {
        for(j=0;j<newtext.length;j++) // second, start a second loop to compare each other
        {

            if(newtext[j].toLowerCase()==newtext[i].toLowerCase())
            {           
            match_counter++;
            }

        if(match_counter >=2) // Found dupe!
        {alert("Matched:"+newtext[j]+" "+newtext[i]+" Counter"+match_counter);
match_counter=0;}


        }
        alert("Match counter:"+match_counter+ " D:"+newtext[i]);'
match_counter=0;
    }
//alert(""+match_counter);
return match_counter;
}

Любые предложения, чтобы сделать это лучше, были бы очень признательны, также я понятия не имею, какдостаньте обманщиков: (
Погуглив, я вижу, что мне, вероятно, придется использовать "склейку", но не совсем уверен.

Заранее спасибо!
R

(PSформат выглядит странно, но это случилось, когда я вставил код)

Ответы [ 5 ]

2 голосов
/ 06 января 2012

много ответов.Вот тот, который использует общую функцию для создания массива уникальных членов.Обратите внимание, что результат будет отсортирован, с использованием объекта и возвращением свойств с использованием for..in, не гарантирует сохранения какого-либо определенного порядка.

var el = document.forms[0].text;
el.value = unique(el.value.toLowerCase().split(/[\n\r]/)).join('\n');

function unique(arr) {
  arr.sort();
  var i = arr.length;

  while (i--) {
    if (arr[i] == arr[i - 1]) {
       arr.splice(i, 1);
    }
  }
  return arr;
}
2 голосов
/ 06 января 2012

Вот моя слабая попытка.Это похоже на

var arr = ["1","2","3","4","5","3","2","3","4"];
var arrCopy = [];
var list = {};

for (var i = 0, len = arr.length; i < len; i++) {
    if(!list[arr[i]])
        arrCopy.push(arr[i]);
    list[arr[i]] = ++list[arr[i]] | 0;
}

Объект также будет содержать сколько дубликатов было для каждого.arrCopy имеет уникальные значения.

РЕДАКТИРОВАТЬ: см. комментарий RobG относительно hasOwnProperty.В этом случае это должно быть

...
    if(!list.hasOwnProperty(arr[i]))
...
1 голос
/ 06 января 2012

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

var initial_array = ['www.yahoo.com', 'www.google.com', 'www.facebook.com', 'www.google.com'];
var set = {};
for (var domain in initial_array){
    set[initial_array[domain].toLowerCase()] = true;
}
alert(set);
0 голосов
/ 06 января 2012

Я думаю, что здесь есть ошибка ..

for(i=0;i<newtext.length;i++) // first iterate over the number of items
{
    for(j=0;j<newtext.length;j++) // second, start a second loop to compare each other

Этот код не должен быть ??

for(i=0;i<newtext.length -1;i++) // first iterate over the number of items
{
    for(j=i+1;j<newtext.length;j++) // second, start a second loop to compare each other

note j=i+1 и newtext.length -1 (последнийнеобязательно)

Тогда:

  if(newtext[j].toLowerCase()==newtext[i].toLowerCase())
      return 'dupe';
0 голосов
/ 06 января 2012

первый Скопируйте массив и вначале введите его в нижнем регистре

второй Массив имеет функцию сортировки в javascript, я предлагаю вам отсортировать ее перед сравнением

третий Я видел, что вы используете пузырьковую сортировку, это хорошо. На for(j=0;j<newtext.length;j++) вам не нужно начинать с 0, вы можете начать с i

последний, используйте что-то уже там, http://api.jquery.com/jQuery.unique/

...