【问题标题】:Update object value in array with values in other array using hashtables or hashmap使用哈希表或哈希映射将数组中的对象值更新为另一个数组中的值
【发布时间】:2020-12-13 15:01:33
【问题描述】:

我有两个数组 Array1Array2,我正在更新 Array1 中对象的速率,并在数组 2 中使用相同对象(具有相同 ID)的速率。我有一个函数可以遍历两个数组以获取期望的结果。在浏览了一些关于堆栈溢出的答案后,我觉得哈希表最适合降低复杂性。我只是想了解如何使用 has 映射来实现相同的功能。

let Array1 = [{
    id: 1,
    name: "IceCream",
    details: [{
        id: "12",
        name: "milk",
        quantity: "50",
        rate: "100"
      },
      {
        id: "13",
        name: "cream",
        quantity: "50",
        rate: "300"
      }
    ]
  },
  {
    id: 2,
    name: "Coffee",
    details: [{
        id: "14",
        name: "Coffee bean",
        quantity: "60",
        rate: "200"
      },
      {
        id: "15",
        name: "water",
        quantity: "60",
        rate: "300"
      }
    ]
  },
  {
    id: 3,
    name: "Tea",
    details: [{
      id: "16",
      name: "Tea leaf",
      quantity: "50",
      rate: "700"
    }]
  }
]
let Array2 = [{
    id: 1,
    name: "IceCream",
    details: [{
        id: "12",
        name: "milk",
        quantity: "50",
        rate: "500"
      },
      {
        id: "13",
        name: "cream",
        quantity: "50",
        rate: "700"
      }
    ]
  },
  {
    id: 2,
    name: "Coffee",
    details: [{
        id: "14",
        name: "Coffee bean",
        quantity: "60",
        rate: "800"
      },
      {
        id: "15",
        name: "water",
        quantity: "60",
        rate: "8000"
      }
    ]
  }
]
Array1 = Array1.map(item => {
  let element = Array2.find(e => e.id == item.id);
  if (element) {
    item.details = item.details.map(e => {
      let detail = element.details.find(d => d.id == e.id);
      if (detail)
        e.rate = detail.rate;
      return e;
    });
  }
  return item;
});
console.log(Array1);

【问题讨论】:

    标签: javascript arrays hash


    【解决方案1】:

    制作Array2 的项目(按id)和Array2 的每个细节(按id)的映射,然后您可以迭代Array1 并以低复杂度改变其属性:

    const items2ById = {};
    for (const item of Array2) {
      items2ById[item.id] = item;
    }
    const items2DetailsById = {};
    for (const detail of Array2.flatMap(({ details }) => details)) {
      items2DetailsById[detail.id] = detail;
    }
    for (const item of Array1) {
      if (!items2ById[item.id]) continue;
      for (const detail of item.details) {
        if (items2DetailsById[detail.id]) {
          detail.rate = items2DetailsById[detail.id].rate;
        }
      }
    }
    

    请注意,由于您正在对现有对象进行变异,.map 并不合适,因为您并不真正关心创建新数组 - 相反,只需遍历数组并根据需要对其进行变异。

    let Array1 = [{
        id: 1,
        name: "IceCream",
        details: [{
            id: "12",
            name: "milk",
            quantity: "50",
            rate: "100"
          },
          {
            id: "13",
            name: "cream",
            quantity: "50",
            rate: "300"
          }
        ]
      },
      {
        id: 2,
        name: "Coffee",
        details: [{
            id: "14",
            name: "Coffee bean",
            quantity: "60",
            rate: "200"
          },
          {
            id: "15",
            name: "water",
            quantity: "60",
            rate: "300"
          }
        ]
      },
      {
        id: 3,
        name: "Tea",
        details: [{
          id: "16",
          name: "Tea leaf",
          quantity: "50",
          rate: "700"
        }]
      }
    ]
    let Array2 = [{
        id: 1,
        name: "IceCream",
        details: [{
            id: "12",
            name: "milk",
            quantity: "50",
            rate: "500"
          },
          {
            id: "13",
            name: "cream",
            quantity: "50",
            rate: "700"
          }
        ]
      },
      {
        id: 2,
        name: "Coffee",
        details: [{
            id: "14",
            name: "Coffee bean",
            quantity: "60",
            rate: "800"
          },
          {
            id: "15",
            name: "water",
            quantity: "60",
            rate: "8000"
          }
        ]
      }
    ];
    const items2ById = {};
    for (const item of Array2) {
      items2ById[item.id] = item;
    }
    const items2DetailsById = {};
    for (const detail of Array2.flatMap(({ details }) => details)) {
      items2DetailsById[detail.id] = detail;
    }
    for (const item of Array1) {
      if (!items2ById[item.id]) continue;
      for (const detail of item.details) {
        if (items2DetailsById[detail.id]) {
          detail.rate = items2DetailsById[detail.id].rate;
        }
      }
    }
    console.log(Array1);

    【讨论】:

    • 非常感谢,这就像魔术一样工作..我正在努力了解地图,您可以参考好的资源..再次感谢!
    • JS 中的“Map”一般指的是developer.mozilla.org/en/docs/Web/JavaScript/Reference/…,我这里没有用到的数据结构。 items2ByIditems2DetailsById 只是普通对象,它们将属性名称连接到值。
    猜你喜欢
    • 1970-01-01
    • 2022-01-12
    • 1970-01-01
    • 2012-08-05
    • 1970-01-01
    • 2019-05-01
    • 2021-06-11
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多