Вы можете использовать flatMap (нативный или Lodash) с Array.from или диапазоном Lodash ()
const products = [
{name: "Apple", description: "A cool apple", qty: 1},
{name: "Water", description: "Some watery water", qty: 3},
]
products.flatMap(product => Array.from({length: product.qty}, () => product));
// result:
// [{name: "Apple", description: "A cool apple", qty: 1},
// {name: "Water", description: "Some watery water", qty: 3},
// {name: "Water", description: "Some watery water", qty: 3},
// {name: "Water", description: "Some watery water", qty: 3}]
products.flatMap(({qty, name, description}) => Array.from({length: qty}, () => ({name, description})));
// result:
// [{name: "Apple", description: "A cool apple"},
// {name: "Water", description: "Some watery water"},
// {name: "Water", description: "Some watery water"},
// {name: "Water", description: "Some watery water"}]
products.flatMap(({qty, name, description}) => range(0, qty).map(() => ({name, description})));
// result:
// [{name: "Apple", description: "A cool apple"},
// {name: "Water", description: "Some watery water"},
// {name: "Water", description: "Some watery water"},
// {name: "Water", description: "Some watery water"}]