我有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的名称。
我似乎无法全神贯注于如何做到这一点,而不会遇到可能使我的订单混乱的特殊情况。
答案 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 = [ {"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));