库存更新挑战

时间:2016-08-08 19:45:33

标签: javascript

我正在尝试解决算法挑战。

以下是提示:

  

比较并更新存储在2D阵列中的库存与新交付的第二个2D阵列。更新当前现有库存物料数量(在arr1中)。如果找不到商品,请将新商品和数量添加到库存数组中。返回的库存数组应按项目的字母顺序排列。

这是我的代码:

function updateInventory(arr1, arr2) {
    // All inventory must be accounted for or you're fired!

  var myMap = new Map();

  for (var i = 0; i < arr1.length; i++){
    myMap.set(arr1[i][1], arr1[i][0]);
  }

  for (i = 0; i < arr2.length; i++){
    if (!myMap.has(arr2[1])){
      myMap.set(arr2[i][1], 0);
    }
    myMap.set(arr2[i][1], myMap.get(arr2[i][1]) + arr2[i][0]);    
  }

  var arr3 = [];

  // sorting
  myMap.forEach(function(value, key){
    var i = 0;

    while (i < arr3.length && key > arr3[i][1])
      i++;

    arr3.splice(i, 0, [value, key]);
  });

  return arr3;

}

// Example inventory lists
var curInv = [
    [21, "Bowling Ball"],
    [2, "Dirty Sock"],
    [1, "Hair Pin"],
    [5, "Microphone"]
];

var newInv = [
    [2, "Hair Pin"],
    [3, "Half-Eaten Apple"],
    [67, "Bowling Ball"],
    [7, "Toothpaste"]
];

updateInventory(curInv, newInv);

https://jsfiddle.net/5fvgdL84/

以下是应该发生的事情:

  

updateInventory([[21,“Bowling Ball”],[2,“Dirty Sock”],[1,“Hair Pin”],[5,“Microphone”],[[2,“Hair Pin” ],[3,“半吃苹果”],[67,“保龄球”],[7,“牙膏”]])

应该返回

  

[[88,“Bowling Ball”],[2,“Dirty Sock”],[3,“Hair Pin”],[3,“Half-Eaten Apple”],[5,“Microphone”], [7,“牙膏”]]。

编辑:我想我已经有了解决方案。但是,代码中似乎有一个我似乎无法找到的错误。我需要特别帮助。

2 个答案:

答案 0 :(得分:0)

如果你愿意,你可以使用Map,我做了类似的事情,只需从'current'数组创建一个对象,这样我就可以维护引用,这使得事情变得更容易,因为函数显然不能简单地返回一个用'替换'当前'的新对象。

// Example inventory lists
var current = [
    [21, "Bowling Ball"],
    [2, "Dirty Sock"],
    [1, "Hair Pin"],
    [5, "Microphone"]
];

var updated = [
    [2, "Hair Pin"],
    [3, "Half-Eaten Apple"],
    [67, "Bowling Ball"],
    [7, "Toothpaste"]
];

function toObj(arr){
  var obj = {};
  arr.forEach((item) => {
    obj[item[1]] = item[0];
  });
  return obj;
}

function updateInventory(current, updated){
  var inventory = toObj(current);
  updated.forEach((item) => {
    inventory[item[1]] = item[0];
  });

  current.length = 0;

  Object.keys(inventory).forEach((key) => {
    var count = inventory[key];
    current.push([count, key]);
  });
}

updateInventory(current, updated);
console.log(current);

这样可以正确替换当前库存。

https://jsfiddle.net/t6x5eag4/

答案 1 :(得分:0)

我发现了这个错误。而不是arr [i] [1],我使用了arr [i],这导致程序无法在地图中找到要覆盖的先前条目。它导致程序只是添加新密钥而不是修改现有密钥。