【问题标题】:Inventory update challenge库存更新挑战
【发布时间】:2016-12-14 17:00:01
【问题描述】:

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

提示如下:

将存储在 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, "保龄球"], [2, "脏袜子"], [1, "发夹"], [5, "麦克风"]], [[2, "发夹" ], [3, "吃掉一半的苹果"], [67, "保龄球"], [7, "牙膏"]])

应该返回

[[88, “保龄球”], [2, “脏袜子”], [3, “发夹”], [3, “吃了一半的苹果”], [5, “麦克风”], [7,“牙膏”]]。

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

【问题讨论】:

    标签: javascript


    【解决方案1】:

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

    // 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/

    【讨论】:

      【解决方案2】:

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

      【讨论】:

        【解决方案3】:

        function updateInventory(arr1, arr2) {
            const store = {};
        
            arr1.concat(arr2).forEach(([value, key]) => {
                store[key] = (store[key] || 0) + value;
            });
        
            const sortedKeys = Object.keys(store).sort();
            
            return sortedKeys.map(key => [store[key], key])
        }

        【讨论】:

        • 您的答案可以通过额外的支持信息得到改进。请edit 添加更多详细信息,例如引用或文档,以便其他人可以确认您的答案是正确的。你可以找到更多关于如何写好答案的信息in the help center
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-05-16
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多