比较和添加项目到对象数组

时间:2016-10-21 20:21:20

标签: javascript arrays multidimensional-array

以下代码应该是:

1)浏览两个数组,

2)如果两个数组中都存在一个项,则将其值添加到第一个数组中类似项的值,

3)如果在arr2但不是arr1中找到该项目,则将该项目添加到arr1。当两个数组具有相同的大小时,我的代码可以正常工作,但这是我得到的不同大小的数组。

结果:

  

[[42," Bowling Ball"],[4," Dirty Sock"],[2," cat"],[6,&# 34;马克杯"],[2,   " Dirty Sock"],[3," rags"]

应该是:

  

[[42," Bowling Ball"],[4," Dirty Sock"],[2," cat"],[3,&# 34;破布"],[3,   "杯子"]]

这是我的代码:

function updateInventory(arr1, arr2) {
  for (var i = 0; i < arr1.length; i++) {
    for (var j = i; j < arr2.length; j++) {
      if (arr1[i][1] === arr2[j][1]) {
        arr1[i][0] += arr2[j][0];
      }
      if (arr1[i].indexOf(arr2[j][1]) === -1) {
        arr1.push(arr2[j]);
      }
      if (arr2.length > arr1.length) {
        arr1.push(arr2[arr2.length -1]);
      }
      else
        break;
    }
  }
  return arr1;
}

var curInv = [
    [21, "Bowling Ball"],
    [2, "Dirty Sock"],
    [2, "cat"],
];

var newInv = [
    [21, "Bowling Ball"],
    [2, "Dirty Sock"],
    [3, "rags"],
    [3, "mugs"]
];

updateInventory(curInv, newInv);

这里有什么问题?

4 个答案:

答案 0 :(得分:1)

您可以为广告资源使用哈希表,并检查并更新currInv

var curInv = [[21, "Bowling Ball"], [2, "Dirty Sock"], [2, "cat"], ],
    newInv = [[21, "Bowling Ball"], [2, "Dirty Sock"], [3, "rags"], [3, "mugs"]],
    inventory = Object.create(null);

curInv.forEach(function (a) {
    this[a[1]] = a;
}, inventory);

newInv.forEach(function (a) {
    if (!this[a[1]]) {
        this[a[1]] = [0, a[1]];
        curInv.push(this[a[1]]);
    }
    this[a[1]][0] += a[0];
}, inventory);

console.log(curInv);
.as-console-wrapper { max-height: 100% !important; top: 0; }

答案 1 :(得分:0)

您可以合并数组或合并数组,以便它自动执行您想要的操作。

  

var array3 = curInv.concat(newInv);

如果你想找到独特的元素

  

//合并两个数组并获取唯一项var array3 = **

0

**

答案 2 :(得分:0)

你认为我过于复杂。这是一个工作片段。

&#13;
&#13;
function updateInventory(arr1, arr2) {
  for (var i = 0; i < arr2.length; i++) {
    var matchFound = false;
    for (var j = 0; j < arr1.length; j++) {
      if (arr1[j][1] === arr2[i][1]) {
        arr1[j][0] += arr2[i][0];
        matchFound = true;
      }
    }

    if (!matchFound) {
      arr1.push(arr2[i]);
    }
  }
  return arr1;
}


var curInv = [
  [21, "Bowling Ball"],
  [2, "Dirty Sock"],
  [2, "cat"],
];

var newInv = [
  [21, "Bowling Ball"],
  [2, "Dirty Sock"],
  [3, "rags"],
  [3, "mugs"]
];

console.log(updateInventory(curInv, newInv));
&#13;
&#13;
&#13;

它做什么

  1. 遍历arr2
  2. 中的所有元素
  3. 遍历arr1
  4. 中的所有元素
  5. 如果找到匹配项,请将arr2中的项目数添加到arr1中的相应值。
  6. 如果未找到匹配项,请将arr2中的该元素添加到arr1

答案 3 :(得分:0)

这是一个简洁的函数式编程样式解决方案,它使用散列(实际为Map)来提高效率:

&#13;
&#13;
function updatedInventory(a, b) {
    return Array.from(
        b.reduce( (m, [v,k]) => m.set(k, (m.get(k) || 0) + v),
                   new Map(a.map ( ([v,k]) => [k,v] )) ), // swap pairs
        ([k,v]) => [v,k]) // swap back afterwards;
}

// Sample data
var curInv = [
    [21, "Bowling Ball"],
    [2, "Dirty Sock"],
    [2, "cat"],
];

var newInv = [
    [21, "Bowling Ball"],
    [2, "Dirty Sock"],
    [3, "rags"],
    [3, "mugs"]
];

// call the function
curInv = updatedInventory(curInv, newInv);
// Output the result
console.log(curInv);
&#13;
.as-console-wrapper { max-height: 100% !important; top: 0; }
&#13;
&#13;
&#13;

如果您的数据具有名称在第一个元素中的对,以及第二个元素中的数字,则代码将会短得多。这是因为Map个对象是用键 - 值对而不是值 - 键对初始化的:

&#13;
&#13;
function updatedInventory(a, b) {
    return [...b.reduce( (m, [v,k]) => m.set(k, (m.get(k) || 0) + v), new Map(a) )];
}

// Sample data
var curInv = [
    ["Bowling Ball", 21],
    ["Dirty Sock", 2],
    ["cat", 2],
];

var newInv = [
    ["Bowling Ball", 21],
    ["Dirty Sock", 2],
    ["rags", 2],
    ["mugs", 2]
];

// call the function
curInv = updatedInventory(curInv, newInv);
// Output the result
console.log(curInv);
&#13;
.as-console-wrapper { max-height: 100% !important; top: 0; }
&#13;
&#13;
&#13;

因为此函数不会改变传递的参数,而是返回结果,所以我将其命名为 updatedInventory 而不是 updateInventory

您尝试使用

的代码的问题
  1. 您的外部循环位于第一个数组上,但这不太实用,因为您很难识别其中缺少的值。你应该首先循环遍历第二个数组。然后你会发现第一个数组中缺少的元素。

  2. 似乎没有充分的理由在外部目前处于的索引处启动内部循环。因此,您最好从0开始。与第一点一起,这将使您的循环看起来像这样:

    for (var j = 0; j < arr2.length; j++) {
      for (var i = 0; i < arr1.length; i++) {
    
  3. 找到匹配项时,没有理由进一步查看,因此您应该退出内部循环:

        if (arr1[i][1] === arr2[j][1]) {
          arr1[i][0] += arr2[j][0];
          break;
        }
    
  4. 您拥有的第二个if实际上正在启动第三个循环,因为indexOf执行迭代。此外,您正在查看arr1[i],它只有两个元素:值和键。那不是你的意图,我确定。

    相反,这段代码应该移到内部循环之外,并且要更正为这样(再次考虑到你的循环根据第2点进行交换):

      if (i >= arr1.length) { // this indicates no match was found
        arr1.push(arr2[j]);
      }
    
  5. 第三个if试图对齐数组的长度,但它可以添加一个已存在于另一个数组中的元素!所以这就必须去。实际上,先前建议的修正已经使阵列对齐。

  6. break你真的杀了它,让你错过了比赛,并且是你获得重复的核心原因(连同问题4)。没有理由在这里打破,因为第一个if在下一个迭代中可能是真的,所以你应该给它一个机会。