Строить JSON по мере того, как присоединяются поля и стоимость в формуляр

У меня есть формуляр, к которому я добавляю поля, которые зависят от многообразного select, и во время добавления стоимости к этим новым произведенным полям я нуждаюсь в том, чтобы строить один json что является стоимостью скрытого поля, которое является тем, которого я стремлюсь к тому, чтобы послать в базу данных.

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

Частично оно функционирует, но последует за следующим:

  1. focus -> я проверяю, существует ли настоящая стоимость в списке, тогда это удаляю
  2. blur -> я добавляю стоимость к списку

Если это происходит два раза в том же поле, действительно шаг 1 оно функционирует, но 2 он добавляет мне обе стоимость к списку снова, бывший и новый. Уже я провожу один день в этом и продолжаю ходить и не нахожу раствор.

Это код, который у меня есть:

data    = []
result  = []
parents = ["0"]
$(document).on('blur', '.adviser-percent', function(){
item        = $(this)
adviserID   = item.attr('data-adviser-id')
percent     = item.val()
parent      = item.parents('.access-level')
level       = parent.attr('data-level-number')
field       = parent.find('.level-number-id')

if (parents[0] != level){
    parents.fill(parent.attr('data-level-number'))
    data = []
}

result  = [ level ]
pair    = [ adviserID, percent ]

data.push(pair)

// https://stackoverflow.com/questions/20997127/how-to-find-the-duplicates-in-a-javascript-multidimensional-array#answer-20997744
noDupes = data
.map(function (item) {
    return JSON.stringify(item);
})
.reduce(function (out, current) {
    if (out.indexOf(current) === -1) out.push(current);
    return out;
}, [])
.map(function (item) {
    return JSON.parse(item);
});

result.push(noDupes)
field.val(JSON.stringify(result))
})

$(document).on('focus', '.adviser-percent', function(){
item        = $(this)
adviserID   = item.attr('data-adviser-id')
percent     = item.val()
parent      = item.parents('.access-level')
level       = parent.attr('data-level-number')
field       = parent.find('.level-number-id')
fieldVal    = field.val()
array       = ( result[1] == null ) ? [] : result[1]

output      = [ level ]
pair        = [ adviserID, percent ]

var filtered = array.filter(function(value, index, arr){
    return JSON.stringify(value) !== JSON.stringify(pair)
})

output.push(filtered)
field.val(JSON.stringify(output))
})

Я присоединяю образ для того, чтобы имелась идея более ясная, чем оно происходит

introducir la descripción de la imagen aquí

Я издаю:

Я не могу использовать раствор, тип посылает неудар в лунку с именем, упорядочиваю, потому что это не единственная игра inputs, так как я имею n уровни, которые сам пользователь добавляет, и внутри каждого уровня есть советники, которые пользователь добавляет также, и поля производятся dinámicamente с jquery. Как я говорю каждому советнику на каком уровне он принадлежит?

nivel 1
    asesor 1, 5%
    asesor 2, 10%
nivel 2
    asesor 1, 7%
    asesor 2, 15%
    asesor n, 30%
nivel 3
    ...

Спасибо заранее

0
задан 19.12.2019, 16:25
1 ответ

Решенная проблема, между другими вещами, была переменной data, которая давала проблемы, так как в каждых focus, blur добавляли под себя повторенную стоимость. Тогда solucionГі в событии focus igualГЎndola он у filtered

data = filtered

В конце концов cГіdigo остался следующего способа:

data    = []
result  = []
parents = ["0"]

$(document).on('focus', '.adviser-percent', function(){
    item        = $(this)
    adviserID   = item.attr('data-adviser-id')
    percent     = item.val()
    parent      = item.parents('.access-level')
    level       = parent.attr('data-level-number')
    field       = parent.find('.level-data')
    fieldVal    = field.val()

    if ( fieldVal !== '' ){
        array = JSON.parse(fieldVal)[1]
    } else if ( result[1] == null ){
        array = []
    } else {
        array = result[1]
    }

    output      = [ level ]
    pair        = [ adviserID, percent ]

    var filtered = array.filter(function(value, index, arr){
        return JSON.stringify(value) !== JSON.stringify(pair)
    })

    output.push(filtered)
    var newData = data.filter(function(value, index, arr){
        return JSON.stringify(value) !== JSON.stringify(pair)
    })

    data = filtered //                   
1
ответ дан 21.12.2019, 12:13