繁体   English   中英

如何基于JavaScript中的另一个数组比较和更新此数组?

[英]How do I compare and update this array based on another array in JavaScript?

我正在研究此挑战 -Free CodeCamp.com上的库存更新 ,挑战指出:

与新鲜交货的第二个2D阵列比较并更新2D阵列中存储的库存。 更新当前现有库存物料数量(以arr1为单位)。 如果找不到物料,则将新物料和数量添加到库存阵列中。 返回的库存数组应按字母顺序排列。

function updateInventory(arr1, arr2) {
    for (var x = 0; x < arr1.length; x++) {

        for (var y = 0; y < arr2.length; y++) {

            if (arr1[x][1] === arr2[y][1]) {
                arr1[x][0] = arr2[y][0]  + arr1[x][0];
            }
        }
    }

 for(var j = 0; j < arr2.length; j++){

     var i = arr2[j][1];

     for(var k = 0; k < arr1.length; k++){
         var idx = arr1.indexOf(i);
          if(idx === -1){
             arr1.push(i);
          }
     }


}
return arr1;

}

当我尝试:

updateInventory([[21, "Bowling Ball"], [2, "Dirty Sock"], 
[1, "Hair Pin"], [5, "Microphone"]], [[2, "Hair Pin"], 
[3, "Half-Eaten Apple"], [67, "Bowling Ball"], 
[7, "Toothpaste"]]).length // I get 8 instead of 6

当我尝试:

updateInventory([[21, "Bowling Ball"], [2, "Dirty Sock"], 
[1, "Hair Pin"], [5, "Microphone"]], [[2, "Hair Pin"], 
[3, "Half-Eaten Apple"], [67, "Bowling Ball"], 
[7, "Toothpaste"]])

我得到: 在此处输入图片说明

什么时候应该得到:

[[88, "Bowling Ball"], [2, "Dirty Sock"], [3, "Hair Pin"], 
[3, "Half-Eaten Apple"], [5, "Microphone"], [7, "Toothpaste"]]

我相信这就是我的问题所在。

for(var j = 0; j < arr2.length; j++){

         var i = arr2[j][1];

         for(var k = 0; k < arr1.length; k++){
             var idx = arr1.indexOf(i);
              if(idx === -1){
                 arr1.push(i);
              }
         }


    }

因为它有点工作。 但是,有人可以在字母排序部分上提供帮助吗? 提前致谢!

尝试这个

function updateInventory(arr1, arr2) {
  for (var x = 0; x < arr1.length; x++) {

    for (var y = 0; y < arr2.length; y++) {

      if (arr1[x][1] === arr2[y][1]) {
        arr1[x][0] = arr2[y][0] + arr1[x][0];
      }
    }
  }

  for (var j = 0; j < arr2.length; j++) {

    var i = arr2[j][1];
    var found = 0;

    for (var k = 0; k < arr1.length; k++) {
      if (arr1[k][1] === arr2[j][1]){
        found = 1;}
    }
    if (found == 0)
      arr1.push(arr2[j]);
  }
  arr1.sort(compareSecondColumn);
  return arr1;

}

用于分类

function compareSecondColumn(a, b) {
    if (a[1] === b[1]) {
        return 0;
    }
    else {
        return (a[1] < b[1]) ? -1 : 1;
    }
}

您也可以这样做,我知道它已经回答了,但只想尝试一下。

 Array.prototype.concatAll = function() { var results = []; this.forEach(function(subArray) { subArray.forEach(function(item) { results.push(item); }); }); return results; }; function updateInventory(arr1, arr2) { arr1.forEach(function(item) { for (var i = 0; i < arr2.length; i++) { if (item[1] === arr2[i][1]) { item[0] = item[0] + arr2[i][0]; } } }); arr1.forEach(function(item) { var tempArray = arr1.concatAll(); for (var e = 0; e < arr2.length; e++) { if (tempArray.indexOf(arr2[e][1]) === -1) { arr1.push(arr2[e]); } } }); arr1 = arr1.sort(function(a, b) { return (a[1] > b[1]) ? 1 : ((b[1] > a[1]) ? -1 : 0); }); alert(arr1); return arr1; } // 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); 

您可以使用内置的数组函数使事情更容易理解。 在我的示例中,我确定您可以组合所有功能,而不用更改oldValues数组。

var oldValues = [[21, "Bowling Ball"], [2, "Dirty Sock"], 
[1, "Hair Pin"], [5, "Microphone"]];

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


newValues.forEach(function(nArr) {
  var i = 0;
  for(i; i < oldValues.length; i++) {
    if(oldValues[i][1] === nArr[1]) {
      oldValues[i] = nArr;
      return;
    }
  }
  oldValues.push(nArr);
});

oldValues.sort(function (ov, nv) {
  return ov[1] > nv[1];
}).forEach(function (v) {
  console.debug(v);
  $('#test').append('<li>[' + v[0] + ', ' + v[1] + ']</li>');
});

http://plnkr.co/edit/VNksR4eoDLEqU7TSoTj1?p=preview

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM