我在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"]
所以很明显第一个元素(在这个例子中)是从多选到后端的选定值的集合。
如何以相当优雅的方式调整上面的代码以获得所需的结果(对于多选和单个输入的任何组合或排序)? 该代码旨在应用于任何动态创建的过滤器,因此可重复使用而不是硬编码到每个过滤器。
答案 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})