Vue
HTML
<div id="app">
<div v-for="item in filters">
<p> {{item.title}} </p>
<ol>
<li v-for="filter in item.filterData.variants">
<label>
<input type="checkbox" v-model="thisIsStorageForCheckboxesStates[`${item.filterId}-${filter.key}`]">
</label>
</li>
</ol>
</div>
<pre>{{ JSON.stringify(selected, null, 2) }}</pre>
</div>
CSS
body {
background: #20262E;
padding: 20px;
font-family: Helvetica;
}
#app {
background: #fff;
border-radius: 4px;
padding: 20px;
transition: all 0.2s;
}
li {
margin: 8px 0;
}
h2 {
font-weight: bold;
margin-bottom: 15px;
}
del {
color: rgba(0, 0, 0, 0.3);
}
Vue
new Vue({
el: "#app",
data () {
return {
thisIsStorageForCheckboxesStates: {},
"filters": [
{
"type": "checkbox",
"title": "Пол",
"filterData": {
"variants": [
{
"key": 14,
"value": "Мужской"
},
{
"key": 15,
"value": "Женский"
}
]
},
"filterId": 1
},
{
"type": "checkbox",
"title": "num",
"filterData": {
"variants": [
{
"key": 2,
"value": "345"
},
{
"key": 1,
"value": "123"
}
]
},
"filterId": 2
}
]
}
},
computed: {
selected() {
return Object.entries(this.thisIsStorageForCheckboxesStates).filter(([ k, v ]) => !!v).reduce((acc, [ k ]) => {
const [ filterId, value ] = k.split('-');
let f = acc.find(n => n.filterId === filterId);
if (!f) {
f = {
filterId,
values: []
};
acc.push(f);
}
f.values.push(+value);
return acc;
}, []);
}
},
})