I have a javascript object below:
let filters = {
numbers: {
'0': 'is_no_selected',
'1': 'is_one_selected',
'2': 'is_two_selected',
'3': 'is_three_selected',
'4': 'is_four_selected',
'5': 'is_five_selected',
},
words: {
please: 'is_please_selected',
help: 'is_help_selected',
me: 'is_me_selected',
},
}
And I got two input:'numbers' and ['4','5']
I want to get:
{
numbers: {
'is_no_selected': false,
'is_one_selected': false,
'is_two_selected': false,
'is_three_selected': false,
'is_four_selected': true,
'is_five_selected': true,
}
}
And when I input other two input:'words' and ['please']
I want to get:
{
words: {
'is_please_selected': true,
'is_help_selected': false,
'is_me_selected': false,
}
}
How to make this happen using reduce()?
Here you go. Not how I would have done it, but if you must use reduce, you can do it like this.
let filters = {
numbers: {
'0': 'is_no_selected',
'1': 'is_one_selected',
'2': 'is_two_selected',
'3': 'is_three_selected',
'4': 'is_four_selected',
'5': 'is_five_selected',
},
words: {
please: 'is_please_selected',
help: 'is_help_selected',
me: 'is_me_selected',
},
}
var numbers = filter(filters, 'numbers', ['4', '5']);
var words = filter(filters, 'words', ['please']);
console.log(numbers);
console.log(words);
function filter(filter_obj, key, input) {
return {
[key]: Object.keys(filters[key]).reduce((a, c) => {
a[filters[key][c]] = input.includes(c)
return a;
}, {})
}
}
You need to get the entries of the object before using reduce:
let filters = {
numbers: {
'0': 'is_no_selected',
'1': 'is_one_selected',
'2': 'is_two_selected',
'3': 'is_three_selected',
'4': 'is_four_selected',
'5': 'is_five_selected',
},
words: {
please: 'is_please_selected',
help: 'is_help_selected',
me: 'is_me_selected',
},
}
function fn(obj, filterKey, filters) {
filters = filters.map(x => ''+x); // convert all filters to strings (keys are always string)
return Object
.keys(obj)
.filter(x => x === filterKey) // only the selected property
.map(x => obj[x]) // get the object
.map(x => {
return Object.entries(x).reduce((out, curr) => {
const [key, val] = curr;
out[val] = filters.includes(key);
return out;
}, {})
});
}
console.log(fn(filters, 'numbers', [0]))
A Basic solution:
function filter(all_option, select_key, select_option) {
let ret = {};
let s_f = all_option[select_key];
for (let k in s_f) {
if (select_option.includes(k)) {
ret[s_f[k]] = true;
} else {
ret[s_f[k]] = false;
}
}
return ret;
}
convert it to map reduce version:
function filter(all_option, select_key, select_option) {
let ret = {};
let s_f = all_option[select_key];
Object.keys(s_f).map(k => {
if (select_option.includes(k)) {
ret[s_f[k]] = true;
} else {
ret[s_f[k]] = false;
}
});
return ret;
}