You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在增删产品元素时同步更新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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.03 21:50:39