如何在增删产品元素时同步更新bucket中的最长生产年份?
同步更新bucket对象的最长生产年份
我有一个存储产品及其生产年份的bucket对象,其中longestYear属性用于记录所有产品里的最长生产年份。现在需要实现:向数组添加新产品时同步更新longestYear,同时还要解决删除元素时如何同步更新这个属性的问题。
原始bucket对象结构如下:
const bucket = { longestYear: 2060, Category_A: [ { productName: "toothpaste", productionYear: 2030 }, { productName: "shampo", productionYear: 2040 }, ], Category_B: [ { productName: "Macbook", productionYear: 2025 }, { productName: "Micosoft_computer", productionYear: 2060 }, ], };
一、添加产品时同步更新最长年份
原来的addProduct函数仅完成了产品添加,没有同步更新longestYear。我们可以在添加产品后,直接判断新产品的生产年份是否大于当前记录的最长年份,若是则直接更新,无需遍历所有产品,效率更高:
const addProduct = (bucket, category, newProduct) => { bucket[category].push(newProduct); // 同步更新最长年份 if (newProduct.productionYear > bucket.longestYear) { bucket.longestYear = newProduct.productionYear; } }; // 调用示例 addProduct(bucket, 'Category_B', { productName: "ASUS", productionYear: 2070 }); console.log(bucket.longestYear); // 输出:2070
二、删除产品时同步更新最长年份
删除产品的情况更复杂:如果删除的产品不是当前最长年份的产品,longestYear可以保持不变;如果删除的产品正好是当前最长年份的产品,就需要重新遍历所有产品,计算出新的最长年份。
我们可以先写一个辅助函数,专门用来重新计算整个bucket的最长生产年份:
const recalculateLongestYear = (bucket) => { let maxYear = 0; // 遍历所有分类 for (const category in bucket) { // 跳过longestYear属性本身 if (category === 'longestYear') continue; // 遍历当前分类下的所有产品 bucket[category].forEach(product => { if (product.productionYear > maxYear) { maxYear = product.productionYear; } }); } bucket.longestYear = maxYear; };
再编写删除产品的函数,在删除后判断是否需要触发重新计算:
const deleteProduct = (bucket, category, productName) => { const categoryProducts = bucket[category]; // 找到要删除的产品索引 const productIndex = categoryProducts.findIndex(product => product.productName === productName); if (productIndex !== -1) { const deletedProduct = categoryProducts[productIndex]; // 删除产品 categoryProducts.splice(productIndex, 1); // 只有删除的是当前最长年份的产品时,才重新计算 if (deletedProduct.productionYear === bucket.longestYear) { recalculateLongestYear(bucket); } } }; // 调用示例1:删除年份为2060的Micosoft_computer deleteProduct(bucket, 'Category_B', 'Micosoft_computer'); console.log(bucket.longestYear); // 输出:2070(因为ASUS的年份仍存在) // 调用示例2:删除年份为2070的ASUS deleteProduct(bucket, 'Category_B', 'ASUS'); console.log(bucket.longestYear); // 输出:2040(重新计算后的最长年份)
内容的提问来源于stack exchange,提问作者Ae Leung
相关产品推荐
相关产品推荐

