jQuery将复选框选择转换为数组
我有这样的 HTML :
<div class="pgggo-list-taxon">
<li>
<label>
<input type="checkbox" name="pgggo-category-sep-56[]">
<div class="icon-box">
<div name="development">Development</div>
</div>
</label>
</li>
<li>
<label>
<input type="checkbox" name="pgggo-category-sep-14[]">
<div class="icon-box">
<div name="food">Food</div>
</div>
</label>
</li>
<li>
<label>
<input type="checkbox" name="pgggo-category-sep-8[]">
<div class="icon-box">
<div name="medical">Medical</div>
</div>
</label>
</li>
<li>
<label>
<input type="checkbox" name="pgggo-category-sep-1[]">
<div class="icon-box">
<div name="uncategorized">Uncategorized</div>
</div>
</label>
</li>
<li>
<label>
<input type="checkbox" name="pgggo-category-sep-2[]">
<div class="icon-box">
<div name="wordpress">WordPress</div>
</div>
</label>
</li>
</div>
每个复选框都有唯一的名称= pgggo-category-sep-56
,pgggo-category-sep-14
.单击多个项目后,会将ID添加到下面的数组的ID字段中.
Each checkbox has unique name = pgggo-category-sep-56
, pgggo-category-sep-14
. As multiple items are clicked the ids are added to the id field of below array.
我正在尝试一种方法,可以给我一个输出数组:
I am trying to have a method which gives me an array as output:
$output = array(
array(
'taxonomy'=> 'category', // pgggo-category-sep-56 --category word is pulled from here
'id'=> array(56,14), // ids are pulled pgggo-category-sep-56 number at the end
)
array(
'taxonomy'=> 'home', // pgggo-home-sep-56 --homeword is pulled from here
'id'=> array(56,14), // ids are pulled pgggo-category-sep-56 number at the end
)
);
我尝试过:
$('.pgggo-container-ajax-sorting').on('click', '.pgggo-list-taxon input', function(event) {
var outputPgggo = $(this).attr('name');
}
但这只会拉出字符串.有什么办法可以做到这一点?
But this only pulls the string. Is there any way to get this done?
我建议将ID存储在对象中,而不要使用数组数组.使用起来更容易.像这样:
I would recommend storing the ids in an object instead of having an array of array. It's easier to work with. Something like this:
const array = {
category: [],
home: [],
};
然后,您始终可以通过一些数组操作将其转换为所需的形式:
Then, you can always transform into the desired form with some array manipulation:
Object.entries(array).map(([taxomony, id]) => ({taxomony, id}))
以下是单击复选框时更新对象的代码:
Here is the code to update the object when a checkbox is clicked:
const array = {};
$('[name^="pgggo-"]').on('click', function() {
const [_, taxonomy, __, attr] = $(this).attr('name').split('-');
const id = attr.split('[')[0];
const checked = $(this).prop('checked');
array[taxonomy] = array[taxonomy] || [];
const index = array[taxonomy].indexOf(id);
index == -1 ? array[taxonomy].push(id) : array[taxonomy].splice(index, 1);
console.log(array);
});
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<div class="pgggo-list-taxon">
<li>
<label>
<input type="checkbox" name="pgggo-category-sep-56[]">
<div class="icon-box">
<div name="development">Development</div>
</div>
</label>
</li>
<li>
<label>
<input type="checkbox" name="pgggo-category-sep-14[]">
<div class="icon-box">
<div name="food">Food (category)</div>
</div>
</label>
</li>
<li>
<label>
<input type="checkbox" name="pgggo-home-sep-14[]">
<div class="icon-box">
<div name="food">Food (home)</div>
</div>
</label>
</li>
<li>
<label>
<input type="checkbox" name="pgggo-category-sep-8[]">
<div class="icon-box">
<div name="medical">Medical</div>
</div>
</label>
</li>
<li>
<label>
<input type="checkbox" name="pgggo-category-sep-1[]">
<div class="icon-box">
<div name="uncategorized">Uncategorized</div>
</div>
</label>
</li>
<li>
<label>
<input type="checkbox" name="pgggo-category-sep-2[]">
<div class="icon-box">
<div name="wordpress">WordPress</div>
</div>
</label>
</li>
</div>
或者,不必麻烦处理重复项和状态.您只能在需要使用时构造数组:
Or, instead of having to go through the trouble of handling duplicates and states. You can construct the array only when you need to use it:
$('.sort-button').on('click', function() {
const array = {};
$('[name^="pgggo-"]').filter(':checked').each(function() {
const [_, taxonomy, __, attr] = $(this).attr('name').split('-');
array[taxonomy] = array[taxonomy] || [];
array[taxonomy].push(attr.split('[')[0]);
});
console.log(array);
});
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<div class="pgggo-list-taxon">
<li>
<label>
<input type="checkbox" name="pgggo-category-sep-56[]">
<div class="icon-box">
<div name="development">Development</div>
</div>
</label>
</li>
<li>
<label>
<input type="checkbox" name="pgggo-category-sep-14[]">
<div class="icon-box">
<div name="food">Food (category)</div>
</div>
</label>
</li>
<li>
<label>
<input type="checkbox" name="pgggo-home-sep-14[]">
<div class="icon-box">
<div name="food">Food (home)</div>
</div>
</label>
</li>
<li>
<label>
<input type="checkbox" name="pgggo-category-sep-8[]">
<div class="icon-box">
<div name="medical">Medical</div>
</div>
</label>
</li>
<li>
<label>
<input type="checkbox" name="pgggo-category-sep-1[]">
<div class="icon-box">
<div name="uncategorized">Uncategorized</div>
</div>
</label>
</li>
<li>
<label>
<input type="checkbox" name="pgggo-category-sep-2[]">
<div class="icon-box">
<div name="wordpress">WordPress</div>
</div>
</label>
</li>
</div>
<button class="sort-button">Show!</button> <!-- for demo purposes -->