【问题标题】:javascript converting array of ints to array of objectsjavascript将整数数组转换为对象数组
【发布时间】:2012-05-11 02:19:21
【问题描述】:

我有一个名为SelectedItems 的整数数组。我有另一个数组,其中包含名为AvailableItems 的对象,它是从 json 解析的;这些Item 对象具有{ContainerID, ContainerName, ItemID, ItemName} 属性。

我想将 SelectedItems 从整数数组转换为 Items 数组,其中每个 ItemID 都替换为与 AvailableItems 中的 ItemID 对应的 Item 对象。 SelectedItems 中的每个 ItemID 都是唯一的。

我从 2 个循环开始:一个循环遍历 SelectedItems 的每个元素,但后来我发现自己每次都循环遍历 AvailableItems 以找到对应的 ItemID 以及我需要复制到 SelectedItems 的对象键.

所以基本上我构建了一个看似非常低效的循环。我想知道是否有更好的方法来避免循环内的重复循环?

样本数据:

对于AvailableItems,你有

{
  ContainerID: i, 
  ContainerName: 'SomeName', 
  ItemID: j, 
  ItemName: 'SomeOtherName'
}

可能是 1,000 个对象,然后 SelectedItems 是整数数组

[23,43,64,34...]

谢谢。

【问题讨论】:

  • 您可以根据第一个数组过滤第二个数组,然后返回结果,使用 Array.filter 之类的函数,您可以使用 Array.indexOf 检查第一个元素中是否包含元素> 每次条件为真时 -1。
  • @camus:好的,您的评论给出了如何更好地重做它的想法。我将带有 jquery.extend 的 AvailableItems 数组复制到一个名为 CandidateItems 的新数组中,然后循环遍历该数组:我检查每个元素的 ItemID 是否在带有 $.InArray 的 SelectedItems 中,如果不是,则删除该元素。在循环结束时,我将 CandidateArray 分配给 SelectedItems 和瞧

标签: javascript performance


【解决方案1】:

如果您能够获得任意AvailableItem 而无需通过仅通过其 ID 寻址它来遍历整个数组(如果您有一个基于索引的数组,其中 ID 是索引),那么您可以通过 SelectedItems并检查它是否存在于AvailableItems 中,如果存在则将SelecteItem 转换为对象并将其添加到某个临时数组以供以后使用。

【讨论】:

  • 好的,您的回答给出了如何更好地重做它的想法。我将带有 jquery.extend 的 AvailableItems 数组复制到一个名为 CandidateItems 的新数组中,然后循环遍历该数组:我检查每个元素的 ItemID 是否在带有 InArray 的 SelectedItems 中,如果不是,则删除该元素。在循环结束时,我将 CandidateArray 分配给 SelectedItems,瞧。
【解决方案2】:

您可以将数字数组AvailableItems 中的每个对象放在与其ItemID 匹配的索引处。

所以您知道ItemID 为 5 的项目位于AvailableItems[5],而不必循环查找。

如果您在不同的ItemID 值之间存在较大差距,不确定这会产生什么影响,但您可以尝试一下,看看它是否有效。


更新:

在快速搜索并阅读this answer 之后,看起来索引之间的间隙不会浪费大量内存。但是,它会影响检查AvailableItems.length 的结果。如果您有一个包含一个条目的数组,但该条目的索引是 500,那么 AvailableItems.length 将返回 501,即使数组中只有一个条目。

只要你不需要使用length 函数,这个解决方案应该适合你。

【讨论】:

  • 好的,我知道如何重做它。我将带有 jquery.extend 的 AvailableItems 数组复制到一个名为 CandidateItems 的新数组中,然后循环遍历该数组:我检查每个元素的 ItemID 是否在带有 InArray 的 SelectedItems 中,如果不是,则删除该元素。在循环结束时,我将 CandidateArray 分配给 SelectedItems 和瞧
猜你喜欢
  • 2019-10-22
  • 1970-01-01
  • 2021-01-07
  • 2017-10-18
  • 1970-01-01
  • 1970-01-01
  • 2019-01-09
  • 2013-09-21
  • 2010-11-10
相关资源
最近更新 更多