Создать функцию массива jQuery

У меня есть следующий код:

$(document).on('change', 'input.authority-email', function() {

    var authorityValues = $(this);

    var authorityArray = [].map.call(authorityValues, function (authorityValues) {
        return authorityValues.value;
    }).join(',');

    $('input#team_authority_emails').val(authorityArray);
});

$(document).on('change', 'input.member-email', function() {

    var memberValues = $(this);

    var memberArray = [].map.call(memberValues, function (memberValues) {
        return memberValues.value;
    }).join(',');

    $('input#team_member_emails').val(memberArray);
});

Я думаю, что этот процесс не очень сухой и может быть отдельной функцией?

[].map.call(memberValues, function (memberValues) {
  return memberValues.value;
}).join(',');

var authorityArray = [].map.call(authorityValues, function (authorityValues) {
  return authorityValues.value;
}).join(',');

Каков наилучший способ создать функцию, которая может создавать и возвращать мой массив? Или есть другие улучшения, которые я могу сделать к этому?

2 ответа

Решение

Концептуально вы хотите выполнить одностороннюю привязку.

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

Вот решение:

function bindValuesToTarget(sourceSelector, targetSelector) {
    var writeValuesToTarget = function() {
       var valuesString= [].map.call($(sourceSelector), function (arrayItem) {
           return arrayItem.value;
       }).join(',');

       $(targetSelector).val(valuesString);
    }        

    $(document).on(
      'change',
      $(sourceSelector),
      writeValuesToTarget
    );

    // You might want to do this the first time, 
    // just in case it never changes
    writeValuesToTarget();
}

bindValuesToTarget('input.member-email', 'input#team_member_emails');
bindValuesToTarget('input.authority-email', 'input#team_authority_emails');
$(document).on('input', 'input.authority-email', function() {
    var valCommas = this.value.replace(/\s+/, ",");  // "a,b,c,foo,bar"
    $('#team_authority_emails').val( valCommas );
});

заменяет один или несколько пробелов одной запятой

Другие вопросы по тегам