按数组2的ID对数组1进行排序。同时根据数组2从数组1中删除和添加元素。

时间:2019-06-12 23:12:32

标签: javascript arrays sorting

我有2个数组。每个填充有唯一的标识号。我想拿第一个数组

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

,并使其顺序与array2的顺序相匹配,具体取决于每个ID值。这样,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的名称。

我似乎无法全神贯注于如何做到这一点,而不会遇到可能使我的订单混乱的特殊情况。

3 个答案:

答案 0 :(得分:0)

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值添加到索引表中。

答案 1 :(得分:0)

  • 它将像array1一样订购array2:
  • 如果数组1中不存在,它将删除array2中的项

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)

答案 2 :(得分:0)

通过您的array1来构建地图:

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

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

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