仓储系统-爆仓

本文介绍了一个简易的仓储管理系统的设计与实现,该系统支持货物的转入与转出操作,并能有效防止因转出操作导致的库存不足(爆仓)情况。通过递归扁平化处理货物类别与数量,确保数据结构简洁高效。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

实现以个简单的仓储系统,可以不断转入和转出货物,货物最多有两层子类目,数字代表该子类目转入/转出的数量。转出时不能出现爆仓情况

/*
cargo 说明:
key代表类目/子类目名称
value为number时,代表这个类目的数量,为object时,代表下一层货物的集合,最多嵌套两层
{
    productA:{ //代表货物的类目名称
        a:1, //1、代表子类目a 的数量
        b:2,
        c:{ //c代表货物的子类名称
            c1:1, //c1代表货物的子类名称
        }
    }
    productB:{
        e:6
    }
}

爆仓情况:如转入{productA:{a:3,c:1}} 转出{productA:{a:4}},就会发生子类目a爆仓,此时要返回报错
*/
class Depository{
    /**
     * @param options
     */
    constructor(options){}
    //转入货物
    transferIn(cargo){}
    //转出货物
    transferOut(cargo){}
}

题解:

class Depository{
    /**
     * @param options
     */
    constructor(params = {}){
        this.store = this.flat(params);
    }
    flat(params = {}){
        var final = {};
        function baseFlat(params,baseKey){
            Object.keys(params).forEach((key) => {
                let value = params[key];
                let finalKey = baseKey ? `${baseKey}.${key}` : key;
                if (typeof value === "object" && value !== null){
                    baseFlat(value,finalKey);
                } else {
                    final[finalKey] = value;
                }
            });
            return final;
        }
        return baseFlat(params);
    }
    //转入货物
    transferIn(params){
        let flatParams = this.flat(params);
        Object.keys(flatParams).forEach((key) => {
            let value = flatParams[key];
            this.store[key] = this.store[key] ? this.store[key] + value : value;
        });
        console.log(this.store);
    }
    //转出货物
    transferOut(params){
        let flatParams = this.flat(params);
        console.log("flatParams",flatParams);
        Object.keys(flatParams).forEach((key) => {
            if(flatParams[key]>(this.store[key] || 0)){
                console.log(key + "爆仓了");
                throw Error(`${key}已爆仓`);
            } else{
                this.store[key] -= flatParams[key];
            }
        });
        console.log(this.store);
    }
}

var c = {
    a:100,
    b:{
        c:{
            d:400,
        },
        f:200,
        g:null,
    },
};
var b = {
    a:100,
    c:{
        d:234,
    },
};
var deps = new Depository(b);
deps.transferIn(c);
deps.transferOut({
    b:{
        c:{
            d:200,
        },
        f:100,
    },
    a:200
});
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值