3 ms·
I agree. The correct solution (given javascript as the language of choice) is something along the following lines: let highlightProducts = (products, index =
by deaddodo 7y ago
I agree. The correct solution (given javascript as the language of choice) is something along the following lines:
let highlightProducts = (products, index = 0) => {
if(index >= products.length) {
return;
}
product = products[index];
if(product.name.indexOf('mountain') !== -1) {
products[index].highlighted = true;
} else if(product.stock > 100 && product.price < 5) {
products[index].highlighted = true;
} else if(product.category == 'outdoors' && product.price < 35 && product.price > 20) {
products[index].highlighted = true;
}
highlightProducts(products, index+1);
}
Personally, I think this exercise is completely fruitless except to teach recursion.
- dan-robertson 7y agoI was expecting the answer to look something like: products.forEach((p) => p.highlighted = ( /mountain/.test(p.name) || (p.stock > 100 && p.price < 5) || (p.category == 'outdoors' && 20 < p.price && p.price < 35))) And if one wants the (implicitly hidden) behaviour that highlighted products stay highlighted forever, just add the condition p.highlighted to the disjunction above.
- dhbradshaw 7y agoWant a job? ;-D
- deaddodo 7y agoforEach is a loop, so this doesn't answer the basic question OP presented.
- dan-robertson 7y agoThe standard doesn’t specify whether or not forEach is a “loop” or not. One could implement it using tail recursion. FWIW I would claim that such recursion should also be called a loop, because the control flow goes in a loop.
- deaddodo 7y agoYou're splitting hairs. I think we can both agree that no implementation does it as such. And if you're going to go to that low of a level, there's no such thing as a loop beyond emergent behavior (they're all conditional branches/jumps).
- maury91 7y agoBy using rest is possible to write it in an immutable (and nicer) way: const highlightProducts = ([product, ...productsToProcess], processedProducts = []) => { if(productsToProcess.length === 0) { return processedProducts; } processedProducts.push({ ...product, highlighted: product.name.indexOf('mountain') !== -1 || product.stock > 100 && product.price < 5 || product.category == 'outdoors' && product.price < 35 && product.price > 20 }) return highlightProducts(productsToProcess, processedProducts); } or in shorter: const highlightProducts = ([product, ...productsToProcess], processedProducts = []) => productsToProcess.length === 0 ? processedProducts : highlightProducts(productsToProcess, [ ...processedProducts, { ...product, highlighted: product.name.indexOf('mountain') !== -1 || product.stock > 100 && product.price < 5 || product.category == 'outdoors' && product.price < 35 && product.price > 20 } ])
- deaddodo 7y agoI agree this is a better solution and immutability is preferable.