Javascript: Добавить значения в CSV, если не в CSV — если уже в CSV — удалить из CSV

#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 — Просто имейте в виду, что для этого требуется каждый раз проходить весь список. Набор отдельных элементов — это в значительной степени определение набора.