说明

实现一个简单的仓储系统,可以不断转入和转出货物,货物最多有两级,数字代表转入或者转出的数量,转出时,不能出现爆仓的情况。

测试用例

  1. {
  2. productA:{
  3. a:1,
  4. b:2,
  5. e:3,
  6. c:{
  7. c1:23
  8. }
  9. }
  10. productB:{
  11. e:6
  12. }
  13. }
  14. //爆仓情况
  15. {productA:{
  16. a:3
  17. }}

  1. class Depository{
  2. constructor(options){
  3. }
  4. transferIn(cargo){
  5. }
  6. transferOut(cargo){
  7. }
  8. }
  1. class Depository{
  2. constructor(options){
  3. const {size} = options
  4. this.size = isNaN(Number(size)) ? 0 :Number(size)
  5. this.products = {}
  6. }
  7. transferIn(cargo){
  8. let flag = true, msg ='入货成功'
  9. for(let pro in cargo) {
  10. if(typeof cargo[pro] === 'number'){
  11. if(typeof this.products[pro] === 'object'){
  12. return {
  13. flag:false,
  14. msg:'货物类型不正确'
  15. }
  16. }
  17. if(this.products[pro]){
  18. this.products[pro] += cargo[pro]
  19. }else{
  20. this.products[pro] = cargo[pro]
  21. }
  22. }else{
  23. if(typeof this.products[pro] === 'number'){
  24. return {
  25. flag:false,
  26. msg:'货物类型不正确'
  27. }
  28. }
  29. this.products[pro] = {}
  30. for(let subPro in cargo[pro]){
  31. if(this.products[pro][subPro]){
  32. this.products[pro][subPro] += cargo[pro][subPro]
  33. }else{
  34. this.products[pro][subPro] = cargo[pro][subPro]
  35. }
  36. }
  37. }
  38. }
  39. return {
  40. flag,msg ,products:this.products
  41. }
  42. }
  43. transferOut(cargo){
  44. let flag = true, msg ='出货成功'
  45. for(let pro in cargo) {
  46. if(typeof cargo[pro] === 'number'){
  47. if(typeof this.products[pro] === 'object'){
  48. flag = false
  49. return {
  50. flag,
  51. msg :'货物类型不正确'
  52. }
  53. }
  54. if(this.products[pro]){
  55. if(this.products[pro] - cargo[pro]< 0 ){
  56. return {
  57. flag:false ,
  58. msg :'爆仓了:'+pro + '不够了'
  59. }
  60. }
  61. this.products[pro] -= cargo[pro]
  62. }else{
  63. return {
  64. flag:false ,
  65. msg :'爆仓了:'+pro + '不够了'
  66. }
  67. }
  68. }else{
  69. if(typeof this.products[pro] === 'number' ||!this.products[pro]){
  70. return {
  71. flag,
  72. msg :'货物类型不正确'
  73. }
  74. }
  75. for(let subPro in cargo[pro]){
  76. if(this.products[pro][subPro]){
  77. if(this.products[pro][subPro] - cargo[pro][subPro]< 0 ){
  78. return {
  79. flag:false ,
  80. msg :'爆仓了:'+pro+':'+subPro + '不够了'
  81. }
  82. }
  83. this.products[pro][subPro] -= cargo[pro][subPro]
  84. }else{
  85. return {
  86. flag,
  87. msg :'货物类型不正确'
  88. }
  89. }
  90. }
  91. }
  92. }
  93. return {
  94. flag,msg
  95. }
  96. }
  97. }
  98. const de = new Depository({})
  99. console.log(de.transferIn({
  100. a:234
  101. }))
  102. console.log(de.transferIn({
  103. b:234
  104. }))
  105. console.log(de.transferIn({
  106. b:{
  107. e:34
  108. }
  109. }))
  110. console.log(de.transferOut({
  111. a:23
  112. }))
  113. console.log(de.transferOut({
  114. b:3
  115. }))
  116. console.log(de.transferIn({
  117. c:{
  118. ef:34
  119. }
  120. }))
  121. console.log(de.transferOut({
  122. c:{
  123. ef:348
  124. }
  125. }))

https://codepen.io/robinson90/pen/YzGpEjy

优化之后

1 针对嵌套的结构提供扁平化结构,提供商品类目扁平化的方法
2 针对仓储做key的私有化判断
3 针对入仓以及出仓的部分都做扁平化

  1. class Depository {
  2. constructor(params = {}) {
  3. this.store = {};
  4. this.transferIn(this.flat(params));
  5. }
  6. flat(params = {}) {
  7. let final = {};
  8. function baseFlat(params, baseKey) {
  9. Object.keys(params).forEach((key) => {
  10. let value = params[key];
  11. let finalKey = baseKey ? `${baseKey}_${key}` : key;
  12. if (typeof value === "object" && value !== null) {
  13. baseFlat(value, finalKey);
  14. } else {
  15. final[finalKey] = value;
  16. }
  17. });
  18. return final;
  19. }
  20. return baseFlat(params);
  21. }
  22. transferIn(params = {}) {
  23. let flag = true,
  24. msg = "入货成功";
  25. const newParams = this.flat(params);
  26. Object.keys(newParams).forEach((key) => {
  27. if (this.store[key]) {
  28. this.store[key] += newParams[key];
  29. } else {
  30. this.store[key] = newParams[key];
  31. }
  32. });
  33. return {
  34. flag,
  35. msg,
  36. products: this.store,
  37. };
  38. }
  39. transferOut(params = {}) {
  40. let flag = true,
  41. msg = "出货成功";
  42. const newParams = this.flat(params);
  43. try {
  44. Object.keys(newParams).forEach((key) => {
  45. if (this.store[key] !== undefined) {
  46. if (this.store[key] - newParams[key] < 0) {
  47. const error = new Error("");
  48. error.info = {
  49. flag: false,
  50. msg: key + " 不够了",
  51. };
  52. throw error;
  53. }
  54. this.store[key] -= newParams[key];
  55. } else {
  56. const error = new Error("");
  57. error.info = {
  58. flag: false,
  59. msg: "没有这类货物",
  60. };
  61. throw error;
  62. }
  63. });
  64. } catch (error) {
  65. return {
  66. flag: false,
  67. msg: error.info.msg,
  68. };
  69. }
  70. return {
  71. flag,
  72. msg,
  73. };
  74. }
  75. }

备注:相比而言,新的扁平化之后的结构,也在商品类目上支持了同父类目既可以是商品,也可以是商品父类。