JavaScript实现商品规格的组合匹配

做商城后台的时候有一个添加商品功能,需要填写商品的规格名和规格值,类似于下图

产品要求可以添加多组,每组的规格值可以有多个。

后台传过来的数据格式如下

let params1 = [
  { name: '颜色', spec: ['黑', '白'] },
  { name: '尺寸', spec: ['s码', 'm码'] }
]

经过程序处理后转换为以下格式。

以下介绍一下自己实现代码的思路

第一步:将规格名处理为一个数组

  /**
   * @将name值转换格式为 ['颜色','尺寸',]
   * */
  let keys=[]
  function keyConvertArr() {
    params1.forEach(item => {
      keys.push(item.name)
    })
  }

第二步:将规格值处理为数组嵌套数组结构

    /**
     * @将spec值转换格式为['黑', '白',['s码', 'm码']]
     * */
    function valueConvertArr() {
        let arr1;
        //判断是否只有一组规格
        if (params1.length !== 1) {
            for (let j = params1.length - 1, i = j; i >= 0; i--) {
                if (!arr1) {
                    params1[i - 1].spec.push(params1[i].spec)
                    arr1 = params1[i - 1].spec
                    if (i <= 1) break
                    i = i - 2
                }
                params1[i].spec.push(arr1)
                arr1 = params1[i].spec
            }
        } else {
            arr1 = params1[0].spec
        }
        //调用deepClone函数将处理好的数组传入
        deepClone(arr1)
    }

第三步:deepClone函数内的逻辑处理

    let obj = {}//结果对象
    let arr = []//结果数组
    let num = 0//判断是在第几层,用作keys的index
    function deepClone(data) {
        for (let i = 0; i < data.length; i++) {
            /**
             * 因为循环到数组的最后一项还是数组的话,已经通过递归传入,所以这里要做的是num--,并退出当前循环。
             * 两级结构此判断没有,三级结构后有用
             * 类似:['黑', '白', ['s码', 'm码',['不锈钢','塑料']]
             */
            if (data[i] instanceof Array) {
                num--
                return
            }
            obj[keys[num]] = data[i]
            if (data[data.length - 1] instanceof Array) {
                num++
                deepClone(data[data.length - 1])
            } else {
                let obj1 = JSON.parse(JSON.stringify(obj))
                arr.push(obj1)
            }
            if (i === data.length - 1) {
                num--
            }
        }
    }

  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
可以使用以下代码实现商品规格选择: ```javascript // 定义商品规格数据 var specs = [ { name: '颜色', values: ['红色', '蓝色', '绿色'] }, { name: '尺寸', values: ['S', 'M', 'L', 'XL'] } ]; // 定义商品数据 var products = [ { id: 1, name: '商品1', price: 100, specs: [ { name: '颜色', value: '红色' }, { name: '尺寸', value: 'S' } ] }, { id: 2, name: '商品2', price: 200, specs: [ { name: '颜色', value: '蓝色' }, { name: '尺寸', value: 'M' } ] }, { id: 3, name: '商品3', price: 300, specs: [ { name: '颜色', value: '绿色' }, { name: '尺寸', value: 'L' } ] } ]; // 定义选择的规格数据 var selectedSpecs = {}; // 选择规格 function selectSpec(name, value) { selectedSpecs[name] = value; updateProduct(); } // 更新商品信息 function updateProduct() { var product = null; for (var i = 0; i < products.length; i++) { var p = products[i]; var match = true; for (var j = 0; j < p.specs.length; j++) { var spec = p.specs[j]; if (selectedSpecs[spec.name] !== spec.value) { match = false; break; } } if (match) { product = p; break; } } if (product) { // 显示商品信息 console.log('商品名称:' + product.name); console.log('商品价格:' + product.price); } else { // 没有匹配商品 console.log('没有匹配商品'); } } // 初始化规格选择器 function initSpecSelector() { var container = document.getElementById('spec-selector'); for (var i = 0; i < specs.length; i++) { var spec = specs[i]; var specContainer = document.createElement('div'); specContainer.innerHTML = '<div>' + spec.name + '</div>'; for (var j = 0; j < spec.values.length; j++) { var value = spec.values[j]; var valueButton = document.createElement('button'); valueButton.innerHTML = value; valueButton.onclick = (function(name, value) { return function() { selectSpec(name, value); }; })(spec.name, value); specContainer.appendChild(valueButton); } container.appendChild(specContainer); } } // 初始化页面 function initPage() { initSpecSelector(); updateProduct(); } initPage(); ``` 在这个代码中,我们定义了商品规格数据和商品数据,然后通过选择规格匹配商品,并显示商品信息。我们使用了一个对象来保存选择的规格数据,然后在选择规格时更新这个对象,然后通过遍历商品数据来匹配商品,最后显示匹配商品信息。我们还定义了一个初始化规格选择器的函数和一个初始化页面的函数,用来初始化页面和规格选择器。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值