Я пытаюсь сравнить ввод строк с Vanilla JS, и мне нужно сравнить их на основе символов. А затем добавьте строку в массив, если строки отличаются более чем на 5 символов. Для более простого объяснения я хочу сравнить эти строки:
И поскольку я сравниваю их по символам, я хочу, чтобы мой массив в этом примере выглядел так после сравнения всех 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",
]
Нет, возможно, это был плохой пример, но он мог бы выглядеть примерно так: «Встроенные системы, часть 1», «Экономика, часть 1», «Встроенные системы, часть 2», «Экономика, часть 2». На самом деле я не знаю. порядок строк
Спасибо, @HereticMonkey, я знаю, и когда я попробовал другой пример, я лучше понял проблему.. Просто не знаю, как это исправить..



![Безумие обратных вызовов в javascript [JS]](https://i.imgur.com/WsjO6zJb.png)


Обновлено:
Судя по вашему редактированию вопроса, похоже, вам нужно проанализировать каждую строку, чтобы получить только определенный раздел текста, а затем отфильтровать полученный массив, чтобы удалить дубликаты. Один из способов сделать это — использовать регулярное выражение. Если вам все еще нужно исключить почти дубликаты, похожие на ваш исходный вопрос, вы можете добавить шаг массива «совпадений» из исходного ответа ниже.
Например:
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 - да, это немного другая проблема. Смотрите редактирование ответа, соответствующее вашему обновленному вопросу.
это идеально, большое спасибо! Что вы делаете в функции match()? Это регулярное выражение? Мне действительно нужно узнать больше о них!!
@Addeuz - да, это регулярное выражение. Вы можете скопировать выражение вместе с вашими текстовыми строками на сайт, например регулярное выражение101, и вы увидите подробное объяснение того, как работает регулярное выражение. В этом случае мы используем некоторые группы без захвата для сопоставления строк-разделителей без «захвата» их, а затем обычную группу захвата для сопоставления текста между строками-разделителями.
Строки всегда парные, как в вашем примере?