Tengo un objeto javascript a continuación:
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', }, } Y obtuve dos entradas: 'numbers' y ['4','5']
Quiero tener:
{ 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, } } Y cuando ingreso otras dos entradas: 'words' y ['please']
Quiero tener:
{ words: { 'is_please_selected': true, 'is_help_selected': false, 'is_me_selected': false, } } ¿Cómo hacer que esto suceda usando reduce() ?
Aquí tienes. No es como yo lo hubiera hecho, pero si debes usar reduce, puedes hacerlo así.
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; }, {}) } }Debe obtener las entradas del objeto antes de usar 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]))Una solución básica:
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; }conviértalo a la versión reducida del mapa:
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; }