Я думаю, что следующее может быть возможным решением с .reduce()
:
const url = {
page: 1,
limit: 20,
price_from: 1,
price_to: 500,
stock_from: 1,
stock_to: 200
};
const keys = ['price', 'stock'];
const entries = Object.entries(url);
const consumableURL = entries.reduce((a, [k, v]) => {
const contains = keys.some(e => k.indexOf(e) !== -1);
if (!contains) {
return {...a, [k]: v};
} else {
const prop = k.split('_')[0];
return { ...a, [prop]: { ...a[prop], [k]: v } };
}
}, {});
console.log(consumableURL);
Или более коротким способом, который не улучшает читаемость, но работает:
const url = { page: 1, limit: 20, price_from: 1, price_to: 500, stock_from: 1, stock_to: 200 };
const keys = ['price', 'stock'];
const entries = Object.entries(url);
const consumableURL = entries.reduce((a, [k, v]) => !keys.some(e => k.indexOf(e) !== -1) ? {...a, [k]: v} : { ...a, [k.split('_')[0]]: { ...a[k.split('_')[0]], [k]: v } }, {});
console.log(consumableURL);
Надеюсь, это поможет!