2016-08-08 62 views
0

我正試圖解決算法挑戰。庫存更新挑戰

這裏是提示:

比較並更新存儲在一個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, 「Dirty Sock」],[1,「髮夾」],[5,「麥克風」]],[[2,「髮夾」],[3,「半食蘋果」],[67,球「],[7,」牙膏「]])

應該返回

[88, 「保齡球」],[2, 「髒襪子」],[3, 「夏萍」],[3, 「吃了一半的蘋果」 ],[5,「麥克風」],[7,「牙膏」]]。

編輯:我想我已經有了一個解決方案。但是,我似乎無法找到代碼中的一個錯誤。我需要特別的幫助。

回答

0

您可以使用地圖,如果你想,我做了簡單地從「當前」陣列創建一個對象,這樣我可以保持基準,這使得事情,因爲功能顯然不能簡單地迴歸輕鬆很多類似的東西一個新的對象用來代替'當前'。

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

0

我發現了什麼錯誤了。而不是arr [i] [1],我使用了arr [i],導致程序無法在映射中找到先前的條目進行覆蓋。它導致程序簡單地添加新的密鑰而不是修改現有的密鑰。