我有两个对象数组,分别是1-variant和2-inventoryLevels。两个数组中的对象共享一个属性,即id。所以我想搜索每个变体的ID是否与任何ventoryLevel相匹配,我想更改其名为shopify_inventory_quantity的属性,并使其具有匹配的stockerinLevel属性吗?我的话虽然很少,但是令人困惑,但是基本上看一下下面的代码,它可以正确执行所需的操作,我只是想知道现在是否可以对其进行嵌套嵌套优化。那么,任何使它高效的帮助将不胜感激?
for (let i = 0; i < variants.length; i++) {
for (let j = 0; j < inventorylevels.length; j++) {
if (variants[i].id === inventorylevels[j].variant_id) {
variants[i].shopify_inventory_quantity = inventorylevels[j].available;
}
}
}
答案 0 :(得分:2)
我了解您在O(n²)
中有一个解决方案。假设您的ID是唯一的,则可以将时间复杂度降低到O(n)
(基本上是 @Alireza 评论的内容)
var variants = [
{id: 0, shopify_inventory_quantity: 0},
{id: 1, shopify_inventory_quantity: 0},
{id: 2, shopify_inventory_quantity: 0}
];
var inventoryLevels = [
{id: 0, available: 10},
{id: 1, available: 2},
{id: 2, available: 3}
];
// O(n) + O(n) = O(n)
function getAvailableVariants(v, i) {
// O(n)
var inventoryLevels = i.reduce(function(inventoryLevels, inventoryLevel) {
inventoryLevels[inventoryLevel.id] = inventoryLevel;
return inventoryLevels;
}, {});
// O(n)
return v.map(variant => Object.assign(variant, {shopify_inventory_quantity: inventoryLevels[variant.id].available}));
}
var results = document.createElement('pre');
results.textContent = JSON.stringify(getAvailableVariants(variants, inventoryLevels), null, '\t');
document.body.appendChild(results);