【问题标题】:Sort Array 1 by ID of Array 2. While removing and adding elements from Array 1 depending on Array 2按数组 2 的 ID 对数组 1 进行排序。根据数组 2 从数组 1 中删除和添加元素时
【发布时间】:2019-06-12 23:12:32
【问题描述】:

我有 2 个数组。每个都充满了唯一的识别号码。我要取第一个数组

array1 = [ 
    {"name":"sos", "id":112},
    {"name":"apa", "id":671},
    {"name":"dos", "id":003},
]

并根据每个 ID 值使其顺序与 array2 的顺序匹配。这样 array1 的每个 id 都等于 array2 ,反之亦然。换句话说,对于每个小于或等于数组长度的 x 值,array1[x].id == array2[x].id。

array2 = [ 
    {"name":"sqe", "id":671},
    {"name":"pep", "id":003},
    {"name":"try", "id":163},
]

我还想删除 array1 中没有在 array2 中对应 id 的任何元素。并将任何 id 值不在 array1 中但在 array2 中的元素添加到 array1 中,同时再次根据其 ID 号对其进行排序。 Array1 必须保留与每个 id 值相关联的名称,但是当添加新元素时,它的名称可以设置为与 array2 相关联的 id 的名称。

如果不遇到可能会打乱我的订单的特殊情况,我似乎无法决定如何实现这一目标。

【问题讨论】:

  • 您的符号在语法上不正确,但您的意思很清楚。
  • 第 1 步:从 array1 创建一个 Map 将 id 映射到对象。
  • 另外,您的array2 不包括数组 1 中的所有 id 值。

标签: javascript arrays sorting


【解决方案1】:

array2 构建一个数组,为每个 id 值提供索引:

var indexes = array2.reduce(function(map, entry, index) {
  map[entry.id] = index;
  return map;
}, {});

现在您可以从array1 创建一个新数组:

var newArray1 = array1.reduce(function(a, entry) {
  a[indexes[entry.id]] = entry;
  return a;
}, []);

现在,在您的示例数据中,您的 array2 不包括 array1 中存在的所有 id 值。从您的问题中不清楚在这种情况下应该做什么。

一种方法是根据array2 中的所有id 值创建一个查找表,然后将array1 中缺少的id 值与一些更大的索引值添加到其中。

【讨论】:

  • 当我能够更深入地研究您的解决方案时,我会给出更全面的回应,感谢您的帮助。如果我理解正确,我会在我的问题中澄清当 array2 不包含来自数组 1 的 id 值时应该做什么?在我的问题中,它说“删除array1中没有array2中对应id的任何元素”。
【解决方案2】:
  • 它会像 array1 一样对 array2 进行排序:
  • 如果数组 1 中不存在,它将删除数组 2 的项

array1 = [ {"name":"sos", "id":112},{"name":"apa", "id":671},{"name":"dos", "id":003}]
array2 = [ {"name":"sqe", "id":671},{"name":"pep", "id":003},{"name":"try", "id":163}]

array2 = array2.filter((item2, i) => {
   let match = false;
   array1.forEach((item1, j) => {
       if(item1.id == item2.id) return match = true;
   })
   return  match
})

console.log(array1)
console.log(array2)

【讨论】:

    【解决方案3】:

    从您的array1 构建地图:

    let map1 = new Map(array1.map(e => [e.id, e]))
    

    然后遍历您的array2 并将每个项目映射到array1 中的对应项目。

    let newArray1 = array2.map(e => map1.get(e.id));
    

    【讨论】:

      猜你喜欢
      • 2020-05-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-11-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多