Как выборочно хранить пользовательский ввод в хеш-карту с помощью JavaScript - PullRequest
0 голосов
/ 10 мая 2018

У меня есть алгоритм, который принимает в качестве параметров файл JSON, например:

{"quiz": {                
  "algorithm_id_1": "4",
  "algorithm_id_2": "2",
  "algorithm_id_3": "3", 
   // ...

algorithm_id - это идентификатор поля ввода, а следующее число - это выбранное пользователем значение для этого поля ввода (большинство из которых являются ползунками).

Мой вопрос таков:

  • Как предотвратить перекрытие в случае, если вход имеет тот же идентификатор, что и другой вход? (например, "algorithm_id_1": "2", "3", а не "algorithm_id_1": "2", ... "algorithm_id_1: "3"?

В настоящее время я получаю идентификатор каждого поля ввода с соответствующим значением, но каждый ответ сохраняется как отдельный объект.

const allInputs = $(":input");

// retrieve
for (var i = 0; i < allInputs.length; i++) {
  allInputs[i].value = localStorage.getItem(i);
}

// populate
jQuery(":input").change(function() {
  for (var i = 0; i < allInputs.length; i++) {
    localStorage.setItem(i, allInputs[i].value);

    // console.log($(":input").get(i).id);
    var map = {};
    var vals = allInputs[i].value;
    var keys = allInputs.get(i).id;
    map[keys] = vals;
    console.log(keys)
  }
});

Контекст: я уверен, что есть более простые способы сделать это, но я ограничен нашим текущим стеком (Node.js и EJS) и не могу сказать, что мы используем. Цель этой функции - собрать ответы от пользователя и затем передать их в алгоритм рекомендаций. Любая помощь будет принята с благодарностью.

1 Ответ

0 голосов
/ 15 мая 2018

Вы можете изменить структуру данных, сделать значения массивов ключей следующим образом:

{
 quiz: {
   algorithm_id_1: [2,3],
   algorithm_id_1: [1,6],
   ...
 }
}

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

По сути, вам нужно проверить, есть ли у объекта уже ключ с таким именем «method_id_1», если он не добавляет его, и установить его значение в массив со значением, введенным пользователем. Если оно уже существует, поместите вновь введенное значение в существующий массив.

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

jQuery(":input").change(function() {
  for (var i = 0; i < allInputs.length; i++) {
    // localStorage.setItem(i, allInputs[i].value);

    // this is the part your question seems to be concerned with
    var map = {};
    var key = allInputs.get(i).id
    var val = allInputs[i].value;

    // if the key already exists in the map
    if(map[key]){
        map[key].push(val)
    } else { // otherwise add it and set its value to an array of 1 entry
        map[key] = [val]
    }

    // this should now be an object of key values where the values are arrays
    console.log(keys)
  }
});

На самом деле я не смог протестировать пример с вашим кодом jquery, однако я считаю, что он должен работать.

...