#javascript
#javascript
Вопрос:
Я создаю строку CSV — поэтому все, что пользователь нажимает на div — строка из 5 символов передается в скрытое поле — что я пытаюсь сделать, это добавить каждое новое значение и создать строку CSV — когда закончите — отобразить в текстовом поле — если значение, передаваемое в CSV, уже существует — удалите его, а затем, как и раньше, отобразите CSV в текстовом поле. У меня есть приведенный ниже, но он просто не работает…
function newQuery(val, id) {
var xy = document.getElementById(id);
var x = parent.document.getElementById('txtCriteria');
var myValue = parent.document.getElementById('txtCriteria').value;
var hdn = document.getElementById("hdnSearch");
hdn.value = "," val;
var element = hdn.value;
var fin;
var leadingComma = element.substring(1, 0).toLowerCase();
var trailingComma = element.substring(element.length - 1);
// Check for leading comma
if (leadingComma == ",") {
fin = element.substring(1);
}
// Check for trailing comma
if (element.charAt(element.length - 1) == ",") {
fin = element.slice(0, -1);
}
if (x.value.search(val) == 0) {
alert('Already exists');
fin.replace(val, "");
x.value = fin;
// Set image to checked
xy.src = 'bullet_plus.png';
}
else if (element.search(val) > 0) {
alert('New Selection: ' fin);
x.value = fin;
// Set image to checked
xy.src = 'bullet_tick.png';
}
}
Ответ №1:
При обработке CSV я рекомендую вам использовать Array.join
и String.split
var foo = "hello, there, so";
var arr = foo.split(","); // ["hello", " there", "so"];
var bar = arr.join(","); // "hello, there, so"
Что касается вашего кода, то он имеет мало смысла без HTML или без полезных имен переменных.
Ответ №2:
Установленная структура данных устраняет много ненужной работы:
function CsvSet(str) {
var set = {};
var arr = str.split(",");
for (var i = 0; i < arr.length; i )
set[arr[i]] = true;
this.set = set;
}
CsvSet.prototype.put = function(val) {
this.set[val] = !this.set[val];
}
CsvSet.prototype.toString = function() {
var res = [];
for (var val in this.set) {
if (this.set[val])
res.push(val);
}
return res.join();
}
Теперь давайте добавим и удалим некоторые элементы:
var set = new CsvSet("one,two,three");
set.put("one"); // remove
set.put("seven"); // add
set.toString();
Вывод:
"two,three,seven"
Комментарии:
1. Лично я нахожу это запутанным способом хранения. Установка существования строкового ключа в значение true / false для определения того, содержится ли он в наборе. Было бы разумнее извлекать / срезать из массива.
2. @Raynos — Просто имейте в виду, что для этого требуется каждый раз проходить весь список. Набор отдельных элементов — это в значительной степени определение набора.