当前位置:首页 > 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. 属性组合生成

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

js实现sku

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. 禁用不可选状态

js实现sku

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

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 数据,考虑以下优化方案:

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

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

标签: jssku
分享给朋友:

相关文章

js实现轮播

js实现轮播

实现轮播图的基本思路 轮播图的核心逻辑是通过定时切换展示的图片或内容,通常结合左右滑动按钮和指示器(小圆点)增强交互性。以下是基于原生JavaScript的实现方法。 HTML结构 构建轮播图的HT…

js 实现继承

js 实现继承

原型链继承 通过让子类的原型对象指向父类的实例来实现继承。子类实例可以访问父类原型上的属性和方法。 function Parent() { this.name = 'parent'; } Par…

js实现复制功能

js实现复制功能

使用 document.execCommand 方法 这种方法适用于较旧的浏览器,但在现代浏览器中可能被逐步淘汰。通过创建一个临时的 textarea 元素,将文本内容放入其中,然后执行复制命令。…

js实现图片放大缩小

js实现图片放大缩小

实现图片放大缩小的基础方法 使用CSS的transform: scale()属性可以快速实现图片的放大缩小效果。通过JavaScript动态修改该属性值: const img = document.…

js 实现链表

js 实现链表

链表的基本概念 链表是一种线性数据结构,由一系列节点组成,每个节点包含数据和指向下一个节点的指针。与数组不同,链表在内存中是非连续存储的,插入和删除操作效率较高。 链表的实现 在 JavaScrip…

js实现驼峰

js实现驼峰

实现驼峰命名的几种方法 使用正则表达式和字符串替换 通过正则表达式匹配字符串中的特定模式(如下划线或短横线),并将其后的字母转换为大写,同时移除分隔符。 function toCamelCase(s…