Сравнение строк по символам

Я пытаюсь сравнить ввод строк с Vanilla JS, и мне нужно сравнить их на основе символов. А затем добавьте строку в массив, если строки отличаются более чем на 5 символов. Для более простого объяснения я хочу сравнить эти строки:

  • Встроенные системы часть 1
  • Экономика часть 1
  • Встроенные системы часть 2
  • Экономика Часть 2
  • Лаборатория встроенных систем

И поскольку я сравниваю их по символам, я хочу, чтобы мой массив в этом примере выглядел так после сравнения всех 4 строк:

array = [
         "Embedded Systems Part 1",
         "Economics Part 1",
         "Embedded Systems Laboration
         ]

Итак, я уже пробовал с этим кодом:

let inputLines = inputArea.value.split("\n")
let summaryArray = []
let differenceVar = 0

for(let inputLine of inputLines) {
    if (summaryArray.length == 0)   
        // Pushes the first input line, so that's in the array                   
        summaryArray.push(inputLine)
    }
    // Using this kind of loop because I want to push to the array
    // in this loop and then compare that newly pushed string to
    // the rest of the strings as well
    for (let i = 0; i < summaryArray.length; i++) {
        const arrayLine = summaryArray[i]
        for (let j = 0; j < arrayLine.length; j++) {
            const arrayChar = arrayLine[j]                       
            const inputChar = inputLine[j]
            if (arrayChar != inputChar) {
                differenceVar++
            }
        }
        if (differenceVar > 5) {
            differenceVar = 0
            summaryArray.push(inputLine)
        }
    }
}

Я заканчиваю с этим массивом:

array = ["SUMMARY:Embedded Systems Part 1",
         "SUMMARY:Economics Part 1",
         "SUMMARY:Embedded Systems Part 2",
         "SUMMARY:Economics Part 2",
         "SUMMARY:Economics Part 2",
         "SUMMARY:Embedded Systems Laboration",
         "SUMMARY:Embedded Systems Laboration",
         "SUMMARY:Embedded Systems Laboration"]

Я понимаю, почему это происходит, потому что он проверяет все строки в массиве, а не только те, которые похожи.

Я пытался сделать это с помощью indexOf(), но это не работает, потому что каждый раз (почти) есть только немного, поэтому он всегда возвращает -1...

Любая помощь в том, как я должен думать об этой проблеме, очень ценится!

Обновлено: Так что мой пример, вероятно, был не самым лучшим, хотя у меня есть догадка о том, как решить мою проблему. Но на самом деле мои строки ввода выглядят так:

array = [
         "SUMMARY:Kurs.grp: Inbyggda system för civilingenjörer Inbyggda system för civilingenjörer Sign: fni Moment: Ibs Program: Civilingenjör datateknik åk 3-",
         "SUMMARY:Kurs.grp: Ekonomi för civilingenjörer Entreprenörskap och företagande för ingenjörer Sign: msbk Moment: Fl 8 Program: Byggingenjörsprogrammet åk 3 Civilingenjör datateknik åk 3- Dataingenjörsprogrammet åk 3 Högskoleingenjör - Ind design och produktutv åk 1- Högskoleingenjör - Industriell ekonomi åk 1- Högskoleingenjör - Maskinteknik åk 1-",
         "SUMMARY:Kurs.grp: Inbyggda system för civilingenjörer Inbyggda system för civilingenjörer Sign: fni Moment: Ibs - Övning grupp 1 Program: Civilingenjör datateknik åk 3-",
         "SUMMARY:Kurs.grp: Inbyggda system för civilingenjörer Inbyggda system för civilingenjörer Sign: fni Moment: Ibs - Övning grupp 2 Program: Civilingenjör datateknik åk 3-",
         "SUMMARY:Kurs.grp: Ekonomi för civilingenjörer Entreprenörskap och företagande för ingenjörer Sign: msbk Moment: Fl 9 Program: Byggingenjörsprogrammet åk 3 Civilingenjör datateknik åk 3- Dataingenjörsprogrammet åk 3 Högskoleingenjör - Ind design och produktutv åk 1- Högskoleingenjör - Industriell ekonomi åk 1- Högskoleingenjör - Maskinteknik åk 1-",
        ]

Это продолжается почти 40 строк.

И из этих входных строк я бы хотел, чтобы выходной массив выглядел так:

outputArray = [
               "Inbyggda system för civilingenjörer Inbyggda system för civilingenjörer",
               "Ekonomi för civilingenjörer Entreprenörskap och företagande för ingenjörer",
              ]

Строки всегда парные, как в вашем примере?

Heretic Monkey 18.02.2019 20:33

Нет, возможно, это был плохой пример, но он мог бы выглядеть примерно так: «Встроенные системы, часть 1», «Экономика, часть 1», «Встроенные системы, часть 2», «Экономика, часть 2». На самом деле я не знаю. порядок строк

Addeuz 18.02.2019 20:34
Редактировать ваш вопрос, чтобы включить более разумный пример.
Heretic Monkey 18.02.2019 20:34

Спасибо, @HereticMonkey, я знаю, и когда я попробовал другой пример, я лучше понял проблему.. Просто не знаю, как это исправить..

Addeuz 18.02.2019 20:47
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
0
4
54
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Обновлено:

Судя по вашему редактированию вопроса, похоже, вам нужно проанализировать каждую строку, чтобы получить только определенный раздел текста, а затем отфильтровать полученный массив, чтобы удалить дубликаты. Один из способов сделать это — использовать регулярное выражение. Если вам все еще нужно исключить почти дубликаты, похожие на ваш исходный вопрос, вы можете добавить шаг массива «совпадений» из исходного ответа ниже.

Например:

const arr = ["SUMMARY:Kurs.grp: Inbyggda system för civilingenjörer Inbyggda system för civilingenjörer Sign: fni Moment: Ibs Program: Civilingenjör datateknik åk 3-", "SUMMARY:Kurs.grp: Ekonomi för civilingenjörer Entreprenörskap och företagande för ingenjörer Sign: msbk Moment: Fl 8 Program: Byggingenjörsprogrammet åk 3 Civilingenjör datateknik åk 3- Dataingenjörsprogrammet åk 3 Högskoleingenjör - Ind design och produktutv åk 1- Högskoleingenjör - Industriell ekonomi åk 1- Högskoleingenjör - Maskinteknik åk 1-", "SUMMARY:Kurs.grp: Inbyggda system för civilingenjörer Inbyggda system för civilingenjörer Sign: fni Moment: Ibs - Övning grupp 1 Program: Civilingenjör datateknik åk 3-", "SUMMARY:Kurs.grp: Inbyggda system för civilingenjörer Inbyggda system för civilingenjörer Sign: fni Moment: Ibs - Övning grupp 2 Program: Civilingenjör datateknik åk 3-", "SUMMARY:Kurs.grp: Ekonomi för civilingenjörer Entreprenörskap och företagande för ingenjörer Sign: msbk Moment: Fl 9 Program: Byggingenjörsprogrammet åk 3 Civilingenjör datateknik åk 3- Dataingenjörsprogrammet åk 3 Högskoleingenjör - Ind design och produktutv åk 1- Högskoleingenjör - Industriell ekonomi åk 1- Högskoleingenjör - Maskinteknik åk 1-"];
const lines = arr.map(line => line.match(/(?:SUMMARY:Kurs.grp:)(.+)(?:Sign:)/)[1]);
const results = lines.filter((line, i) => {
  if (!lines.slice(0, i).includes(line)) {
    return true;
  }
  
  return false;
});

console.info(results);
// [" Inbyggda system för civilingenjörer Inbyggda system för civilingenjörer ", " Ekonomi för civilingenjörer Entreprenörskap och företagande för ingenjörer "]

ОРИГИНАЛ:

Похоже, вы пытаетесь удалить строки из своего массива в зависимости от того, начинаются ли они с последовательности символов без учета регистра, которая совпадает с предыдущей строкой в ​​массиве. Если это точное изложение вашей цели, то вы можете использовать следующий подход.

  • split() ввод текста в конце строки
  • map() результирующий массив в соответствующий массив «совпадений», где каждая строка в нижнем регистре и желаемое количество символов удаляется с конца строка (5 в данном случае)
  • filter() массив, проверив, строчная/нарезанная версия текущей строки существует в любом предыдущем индекс в массиве совпадений

Например:

const text = `Embedded Systems part 1
Economics part 1
Embedded Systems part 2
Economics Part 2
Embedded Systems Laboration`;
  
const lines = text.split('\n');
const matches = lines.map(line => line.toLowerCase().slice(0, -5));
const results = lines.filter((line, i) => {
  if (!matches.slice(0, i).includes(line.toLowerCase().slice(0, -5))) {
    return true;
  }
  
  return false;
});

console.info(results);
// ["Embedded Systems part 1", "Economics part 1", "Embedded Systems Laboration"]

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

Addeuz 19.02.2019 12:20

@Addeuz - да, это немного другая проблема. Смотрите редактирование ответа, соответствующее вашему обновленному вопросу.

benvc 19.02.2019 15:13

это идеально, большое спасибо! Что вы делаете в функции match()? Это регулярное выражение? Мне действительно нужно узнать больше о них!!

Addeuz 19.02.2019 16:32

@Addeuz - да, это регулярное выражение. Вы можете скопировать выражение вместе с вашими текстовыми строками на сайт, например регулярное выражение101, и вы увидите подробное объяснение того, как работает регулярное выражение. В этом случае мы используем некоторые группы без захвата для сопоставления строк-разделителей без «захвата» их, а затем обычную группу захвата для сопоставления текста между строками-разделителями.

benvc 19.02.2019 16:35

Другие вопросы по теме