在一个数组中搜索并替换第二数组中的对象属性值?

时间:2019-08-16 11:04:39

标签: javascript for-loop search

我有两个对象数组,分别是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;
    }
  }
}

1 个答案:

答案 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);