以下代码应该是:
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);
这里有什么问题?
答案 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)
你认为我过于复杂。这是一个工作片段。
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;
arr2
。arr1
。arr2
中的项目数添加到arr1
中的相应值。arr2
中的该元素添加到arr1
。答案 3 :(得分:0)
这是一个简洁的函数式编程样式解决方案,它使用散列(实际为Map
)来提高效率:
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;
如果您的数据具有名称在第一个元素中的对,以及第二个元素中的数字,则代码将会短得多。这是因为Map
个对象是用键 - 值对而不是值 - 键对初始化的:
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;
因为此函数不会改变传递的参数,而是返回结果,所以我将其命名为 updatedInventory 而不是 updateInventory 。
您的外部循环位于第一个数组上,但这不太实用,因为您很难识别其中缺少的值。你应该首先循环遍历第二个数组。然后你会发现第一个数组中缺少的元素。
似乎没有充分的理由在外部目前处于的索引处启动内部循环。因此,您最好从0开始。与第一点一起,这将使您的循环看起来像这样:
for (var j = 0; j < arr2.length; j++) {
for (var i = 0; i < arr1.length; i++) {
找到匹配项时,没有理由进一步查看,因此您应该退出内部循环:
if (arr1[i][1] === arr2[j][1]) {
arr1[i][0] += arr2[j][0];
break;
}
您拥有的第二个if
实际上正在启动第三个循环,因为indexOf
执行迭代。此外,您正在查看arr1[i]
,它只有两个元素:值和键。那不是你的意图,我确定。
相反,这段代码应该移到内部循环之外,并且要更正为这样(再次考虑到你的循环根据第2点进行交换):
if (i >= arr1.length) { // this indicates no match was found
arr1.push(arr2[j]);
}
第三个if
试图对齐数组的长度,但它可以添加一个已存在于另一个数组中的元素!所以这就必须去。实际上,先前建议的修正已经使阵列对齐。
break
你真的杀了它,让你错过了比赛,并且是你获得重复的核心原因(连同问题4)。没有理由在这里打破,因为第一个if
在下一个迭代中可能是真的,所以你应该给它一个机会。