如何将多选数值和单个输入组合在一起?

时间:2018-01-17 22:28:56

标签: javascript jquery arrays coffeescript

我在Web应用程序页面上有一些动态创建的过滤器,其中过滤器“条目”有时是几个不同输入的组合,并且集合的值被收集到一个数组中以发送回服务器。如果这些只是单个输入,那么一组值很容易映射到后端的输入,但是当一个或多个值是multiselect有多个选项时,会混合{{{1}的扁平数组值1}}的值和单个输入值不合适。

举个例子:如果我在搜索控制页面上有一个给定过滤器的两个输入,一个是多选,另一个是文本输入,我想收集两个元素的数组,第一个是选定值的数组,第二个是在文本输入中输入的值。因此,如果在第一个 multiselect 中选择multiselect text 输入,我输入"A", "B",下面的代码收集输入值:

CoffeeScript的:

"Joe"

Javascript :(从上面转换)

filters = []
$(@customFilterElements.selector).each ->
  filterName = $(@).find('.filter_entry .filter_name:input').val()
  filterValues = $(@).find('.filter_entry .filter_value:input').map(->
   if $(@).data('multiselect')
     $(@).find('option:selected').map(->
       $(@).val()
     ).get()
   else
     $(@).val()
  ).get()
  filters.push({name: filterName, value: filterValues}) 

var filters = []; $(this.customFilterElements.selector).each(function() { var filterName, filterValues; filterName = $(this).find('.filter_entry .filter_name:input').val(); filterValues = $(this).find('.filter_entry .filter_value:input').map(function() { if ($(this).data('multiselect')) { return $(this).find('option:selected').map(function() { return $(this).val(); }).get(); } else { return $(this).val(); } }).get(); return filters.push({ name: filterName, value: filterValues }); }); 的当前结果: filterValues

以上代码最终为["A","B","Joe"]生成数组["A","B","Joe"]

我认为这可能是因为filterValues正在将所有内容转换为扁平数组。我尝试使用.get()而不是$.makeArray(),我得到了相同的结果,但也许我错过了一些东西。

.get()所需的结果: filterValues

我希望产生的是[["A","B"],"Joe"]所以很明显第一个元素(在这个例子中)是从多选到后端的选定值的集合。

如何以相当优雅的方式调整上面的代码以获得所需的结果(对于多选和单个输入的任何组合或排序)? 该代码旨在应用于任何动态创建的过滤器,因此可重复使用而不是硬编码到每个过滤器。

1 个答案:

答案 0 :(得分:0)

好的,经过一整晚的休息后,答案立刻传到了我身上,现在看起来很明显 - 只需要在multiselect之后将.get()包裹在数组括号中! - doh。有时在这里记录问题迫使解决方案冒泡或突出我缺少的东西。

filters = []
$(@customFilterElements.selector).each ->
  filterName = $(@).find('.filter_entry .filter_name:input').val()
  filterValues = $(@).find('.filter_entry .filter_value:input').map(->
   if $(@).data('multiselect')
     [$(@).find('option:selected').map(->
       $(@).val()
     ).get()]
   else
     $(@).val()
  ).get()
  filters.push({name: filterName, value: filterValues})