Я пытаюсь использовать оператор if include в своем проекте Node JS для фильтрации результатов, извлеченных из файла .txt. Идея состоит в том, что серийный номер, который вводит пользователь, соответствует конкретным моделям из первых 5 цифр, поэтому я хотел бы фильтровать данные, которые помещаются в мой HTML <select>, однако, похоже, это работает только в том случае, если вся строка идентична. Возможно, я ошибаюсь (я очень новичок в JS, так что вполне возможно), но я понимаю, что .includes должно быть «если X содержит Y», а не «если X = Y». Я использовал его в другом месте своего проекта для ввода текста, и он ведет себя не так.
<div class = "col-md-12 text-center serialtab">
<h1>Serial Number:</h1>
<input type = "text" minlength = "10" required id = "serialnumberinput" name = "serialnumberinput" class = "serialtextbox" placeholder = "Type Serial Number Here: 19180-12345">
<button type = "submit" class = "buttonalt serialsubmit" id = "serialsubmit" onclick = "ReadSerials(), PopulateModelList();">SUBMIT</button>
</div>
....
<select class = "fixselect" name = "model" id = "model" onchange = "ReadModels()">
<option value = "" selected = "selected" >Select Model</option>
<!-- Models are added from the modelist.js script from the model.txt file -->
</select>
function PopulateModelList() {
const fs = require("fs");
const { parse } = require("csv-parse");
var modellist = document.getElementById('model');
var serial = document.getElementById("serialnumberinput").value; //I have tried without .value also
var serialmodel = serial.substring(0,5); //Adding .value to this results in 'undefined'
var testing = document.getElementById("modeltesting");
testing.innerHTML += serialmodel; //Outputs '19180'
fs.createReadStream("./model.txt") //Tried using it as a .csv also but it did not change anything
.pipe(parse({
delimiter: ",",
from_line: 1,
}))
.on("data", function(row) {
console.info(row);
if (row.includes(serialmodel)) {
modellist.innerHTML += '<option value = "' + row + '">' + row + '</option>' ;
}
else {
}
})
}
Моя переменная «serialmodel» выводит «19180», а строка, которую она должна вызывать из файла .txt, — «19180 — Тестирование». Если я изменю свой HTML, чтобы разрешить ввод текста, и введу полную строку «19180 - Тестирование» в поле «serialnumberinput», тогда функция будет работать так, как задумано, поэтому, похоже, потребуется, чтобы вся строка совпадала. Вместо этого я попытался использовать indexOf, однако при этом выводится только весь файл. Я попробовал ряд других обходных путей, которые нашел в других сообщениях на форуме, однако я возвращаюсь к этому проекту после перерыва, поэтому не могу вспомнить, что именно это было, извините.
@canon поднимает хороший вопрос: какой тип данных у вас row
, когда вы его регистрируете?
@mykaf Я только что выполнил внутренний HTML со строкой вне оператора if, и это похоже на массив, он прав. Сейчас попробую этот метод some(), чтобы посмотреть, смогу ли я заставить его работать.
Предположительно, ваш анализатор CSV предоставляет row
как массив значений ячеек.
Из MDN на Array.prototype.includes()
:
Метод
includes()
сравниваетsearchElement
с элементами массива, используя алгоритм SameValueZero.
TLDR: метод массива ищет целое значение, а не его часть.
Если вы хотите проверить, содержит ли какой-либо строковый элемент в массиве подстроку, вы можете использовать Array.prototype.some()
в сочетании с String.prototype.includes()
, например:
const row = [true, Infinity, "19180 - Testing", null, "foo"];
const serialModel = "19180"
const containsSerialModel = row.some(cellValue =>
typeof cellValue === "string"
&& cellValue.includes(serialModel)
);
console.info(`"${serialModel}" ${containsSerialModel ? "found" : "not found"}`);
Мне потребовалось некоторое время, чтобы заставить это работать из-за моего нубства, но это сработало, спасибо за ваш ответ!
@CB700, конечно. Удачи там ;)
Вы также должны включить соответствующий HTML-код.