当前位置:首页 > JavaScript

js实现sku

2026-03-14 07:06:45JavaScript

实现 SKU(库存量单位)的 JavaScript 方案

SKU(Stock Keeping Unit)是电商系统中用于管理商品组合的核心功能,通常涉及属性组合、库存计算和价格联动。以下是实现 SKU 的几种常见方法:

数据结构设计

使用嵌套对象或数组存储商品属性和组合关系:

const skuData = {
  // 属性列表
  attributes: [
    { name: '颜色', values: ['红色', '蓝色'] },
    { name: '尺寸', values: ['S', 'M'] }
  ],
  // SKU 组合
  skus: [
    { 
      attributes: ['红色', 'S'], 
      stock: 10, 
      price: 99 
    },
    { 
      attributes: ['蓝色', 'M'], 
      stock: 5, 
      price: 109 
    }
  ]
}

核心算法实现

1. 属性组合生成

通过笛卡尔积计算所有可能的属性组合:

function generateCombinations(attributes) {
  return attributes.reduce((acc, attr) => {
    return acc.flatMap(x => 
      attr.values.map(v => [...x, v])
    )
  }, [[]]).filter(arr => arr.length > 0)
}

2. SKU 匹配验证

检查当前选择的属性是否匹配有效 SKU:

function isValidSku(selected, skus) {
  return skus.some(sku => 
    selected.every((val, i) => val === sku.attributes[i])
  )
}

3. 禁用不可选状态

当部分选择导致某些属性不可组合时禁用选项:

function getDisabledStatus(attributes, selected, skus) {
  return attributes.map((attr, attrIndex) => {
    return attr.values.map(value => {
      const testSelected = [...selected]
      testSelected[attrIndex] = value
      return !hasValidCombination(testSelected, skus)
    })
  })
}

完整实现示例

class SKUManager {
  constructor(data) {
    this.attributes = data.attributes
    this.skus = data.skus
  }

  // 获取当前库存状态
  getStockInfo(selected) {
    const matched = this.skus.find(sku =>
      selected.every((val, i) => val === sku.attributes[i])
    )
    return matched ? { stock: matched.stock, price: matched.price } : null
  }

  // 获取可选状态矩阵
  getAvailabilityMatrix(selected) {
    return this.attributes.map((attr, i) => {
      return attr.values.map(value => {
        const testSelection = [...selected]
        testSelection[i] = value
        return this.hasValidCombination(testSelection)
      })
    })
  }

  hasValidCombination(selection) {
    return this.skus.some(sku =>
      selection.every((val, i) => 
        val === null || val === sku.attributes[i]
      )
    )
  }
}

可视化交互实现

结合前端框架(如 Vue/React)实现动态交互:

// React 示例
function SkuSelector({ data }) {
  const [selected, setSelected] = useState(Array(data.attributes.length).fill(null))
  const manager = new SKUManager(data)

  const availability = manager.getAvailabilityMatrix(selected)
  const stockInfo = manager.getStockInfo(selected)

  const handleSelect = (attrIndex, value) => {
    const newSelected = [...selected]
    newSelected[attrIndex] = value
    setSelected(newSelected)
  }

  return (
    <div>
      {data.attributes.map((attr, i) => (
        <div key={attr.name}>
          <h4>{attr.name}</h4>
          {attr.values.map((value, j) => (
            <button
              key={value}
              disabled={!availability[i][j]}
              onClick={() => handleSelect(i, value)}
            >
              {value}
            </button>
          ))}
        </div>
      ))}
      {stockInfo && (
        <div>库存: {stockInfo.stock} | 价格: {stockInfo.price}</div>
      )}
    </div>
  )
}

性能优化建议

对于大规模 SKU 数据,考虑以下优化方案:

js实现sku

  • 使用位运算压缩属性组合的存储
  • 实现 LRU 缓存机制存储计算结果
  • 采用字典树(Trie)结构加速 SKU 匹配
  • 对不可选状态计算使用备忘录模式

这种实现方式可以处理大多数电商场景下的 SKU 选择需求,包括动态属性组合、库存验证和价格展示等功能。根据具体业务需求,可以进一步扩展支持多规格、图片切换等高级功能。

标签: jssku
分享给朋友:

相关文章

vue.js实现轮播

vue.js实现轮播

Vue.js 实现轮播功能 使用第三方库(推荐) Vue.js 生态中有许多成熟的轮播组件库,例如 vue-awesome-swiper 或 swiper,它们功能丰富且易于集成。 安装 swipe…

js实现打印

js实现打印

使用window.print()方法实现打印 在JavaScript中,可以通过调用window.print()方法直接触发浏览器的打印功能。这会打开系统的打印对话框,用户可以选择打印机和设置打印选项…

js实现抽奖

js实现抽奖

实现抽奖功能的基本思路 抽奖功能的核心是随机选择奖项并展示结果。可以通过数组存储奖项,利用随机数生成索引,最后通过动画增强用户体验。 准备奖项数据 定义一个数组存储奖项信息,每个奖项可以包含名称、图…

js实现选题

js实现选题

实现选题功能的JavaScript方法 基础实现方案 使用数组存储选项,通过随机索引选取: const options = ['选项A', '选项B', '选项C', '选项D']; const r…

使用js实现

使用js实现

使用JavaScript实现 JavaScript可以通过Math.random()函数生成随机数,结合其他方法可以实现多种随机数生成需求。 // 生成0到1之间的随机小数 const random…

js树实现

js树实现

树的基本概念 树是一种非线性的数据结构,由节点和边组成。每个节点包含一个值和指向子节点的引用。树的顶部节点称为根节点,没有子节点的节点称为叶节点。 树的实现方式 在JavaScript中,树可以通过…