Как заменить часть строки с элементами массива в jQuery? - PullRequest
0 голосов
/ 06 ноября 2019

У меня есть патч кода, как показано ниже:

var originalText = "111@gmail.com;333@gmail.com;555@gmail.com;";
var compareArr = ["111@gmail.com;222@gmail.com","333@gmail.com;444@gmail.com"];
var result = "";

Здесь каждый элемент originalText должен сравниваться с каждым элементом в массиве compareArr. Если первая буква элемента в массиве совпадает, то она должна заменить исходную строку элементом в массиве.

В приведенном выше примере '111@gmail.com ;;'присутствует в массиве, поэтому '111@gmail.com;'будет заменен на «111@gmail.com; 222@gmail.com;». Опять же, «333@gmail.com;»присутствует в массиве, поэтому «333@gmail.com;»будет заменен на «333@gmail.com; 444@gmail.com;».

Конечный результат, который мне нужен, - «111@gmail.com; 222@gmail.com; 333@gmail.com;444@gmail.com; 555@gmail.com; '

Это то, что я пробовал до сих пор, что дает мне только первую строку' 111@gmail.com; 222@gmail.com; 'в выводе.

var originalText = "111@gmail.com;333@gmail.com;555@gmail.com;";
var compareArr = ["111@gmail.com;222@gmail.com","333@gmail.com;444@gmail.com"];
var result = "";

var arr1 = originalText.split(";");
for (x=0;x<arr1.length-1;x++)
{
    for(y=0;y<compareArr.length;y++)
    {
        var arr2 = compareArr[y].split(";");
        if(arr2[y] == arr1[x])
        {
            result += compareArr[y];
        }
    }
}
console.log(result);

Я ожидал, что вывод будет '111@gmail.com; 222@gmail.com; 333@gmail.com; 444@gmail.com; 555@gmail.com;', но я получаю '111@gmail.com; 222@gmail.com ;;'.

Ответы [ 4 ]

1 голос
/ 06 ноября 2019

В вашем втором цикле if условие неверное. Вы должны проверить с первым элементом, то есть 0 index, но вы проверяли с y. Это вызывает проб.

var arr1 = originalText.split(";");
for (x=0;x<arr1.length-1;x++)
{
    for(y=0;y<compareArr.length;y++)
    {
        var arr2 = compareArr[y].split(";");
        if(arr2[0] == arr1[x])
        {
            result += compareArr[y]+';';
        }
    }
}
1 голос
/ 06 ноября 2019

В результате вы используете индекс для сравнения и получаете неправильный символ. Будет проще, если я покажу вам:

var originalText = "s;y;g;";
var compareArr = ["s;u;","y;o;"];
var result = "";

var arr1 = originalText.split(";");
for (x=0;x<arr1.length-1;x++) // Will run through s, y and g
{
    for(y=0;y<compareArr.length;y++) // For each character (s,y,g) will run through "s;u;","y;o;"
    {
        var arr2 = compareArr[y].split(";");
        if(arr2[y] == arr1[x])
        {
            result += compareArr[y];
        }
    }
}
console.log(result);

Давайте рассмотрим

  • Когда первый for равен s [x = 0]:
    • Второй for равен с; u; [y = 0];
      • arr2 = ['s', 'u']
      • Ваш if делает (arr2[0] == arr1[0]), то есть (s == s) - Он входит внутрь для
    • Второй for равен y; o; [y = 1]
      • arr2 = ['y', 'o']
      • Ваш if делает (arr2[1] == arr1[0]), то есть (o == s) - Не попадает внутрь IF ---> Вот проблема, так как в вашем условии IF вы просто используете тот же индекс Y,он никогда не будет использовать символ "y" из compareArr[1].

Таким образом, решение в условии if всегда использует индекс 0как if (arr2[0] == arr1[x]. Но если вам нужно сравнить и вторую букву, то вам нужно немного реорганизовать ваш код.

В целом, ваш код немного запутан, я бы посоветовал использовать некоторые методы или какой-нибудь массив .methods чтобы улучшить его.

0 голосов
/ 06 ноября 2019

Спасибо @Gowri, согласно вашему предложению, я изменил свой код. Кроме того, я пропустил добавление оставшейся строки, которую я добавил снова. Ниже мой окончательный рабочий код.

var originalText = "111@gmail.com;333@gmail.com;555@gmail.com;666@GMAIL.COM;";
var compareArr = ["111@gmail.com;222@gmail.com","333@gmail.com;444@gmail.com;"];
var result = "";
var resultArr = [];

var arr1 = originalText.split(";");
for (x=0;x<arr1.length-1;x++)
{
    for(y=0;y<compareArr.length;y++)
    {
        var arr2 = compareArr[y].split(";");
        if(arr2[0] == arr1[x])
        {
            result += compareArr[y];
        }
        else
        {
            result+=arr1[x] + ";";
        }
    }
}

function unique(list)
{
    var result = [];
    $.each(list, function(i, e) {
        if ($.inArray(e, result) == -1) result.push(e);
    });
    return result;
}

resultArr = result.split(";");
resultArr = unique(resultArr);
resultArr = resultArr.filter(function(X){return X!==''});
console.log(resultArr);

0 голосов
/ 06 ноября 2019
enter code here
var originalText = "111@gmail.com;333@gmail.com;555@gmail.com;";
var compareArr = ["111@gmail.com;222@gmail.com","333@gmail.com;444@gmail.com"];
var result = "";

var arr1 = originalText.split(";");
for (x=0;x<arr1.length-1;x++)
{
   for(y=0;y<compareArr.length;y++)
   {
      var arr2 = compareArr[y].split(";");
      if(arr2[0] == arr1[x])
      {
       result += compareArr[y];
   }
  else
        {
       var test = arr1[x];
       if(result.indexOf(test) != -1)
       {
        result;
       }
       else
       {
        result += ";" + test;
        }

        } 
     }
}
console.log(result);
...