比较两个对象数组并根据一个对象数组进行排序,并在不匹配时推送



我在javascript 中有两个数组

array1 = [{id: 4, value:'xyz'}, {id: 2, value:'pqr'}, {id: 5, value:'abc'}]
array2 = [
[{id: 5, value:'abc'}, {id: 4, value:'xyz'}],
[{id: 5, value:'abc'}, {id: 2, value:'pqr'}],
[{id: 4, value:'xyz'}, {id: 2, value:'pqr'}],
[{id: 2, value:'pqr'}, {id: 5, value:'abc'}]
]

array2是对象阵列的阵列,数组2中的所有这些数组都应该首先按照array1序列进行排序,然后如果该特定id不存在于该特定索引中,则应该推送具有null的对象。

output = [
[{id: 4, value:'xyz'}, {id: null, value:null}, {id: 5, value:'abc'}],
[{id: null, value:null}, {id: 2, value:'pqr'}, {id: 5, value:'abc'}],
[{id: 4, value:'xyz'}, {id: 2, value:'pqr'}, {id: null, value:null}],
[{id: 4, value:'xyz'}, {id: 2, value:'pqr'}, {id: null, value:null}],
[{id: null, value:null}, {id: 2, value:'pqr'}, {id: 5, value:'abc'}]
].

这是我的代码

export const mapOrder = (array, order, key) => {
let arr = [];
array.sort((a, b) => {
let A = a[key];
let B = b[key];
if (order.indexOf(A) > order.indexOf(B)) {
return 1;
}
return -1;
});
if (order.length > 0) {
for (let i = 0; i < order.length; i++) {
for (let j = 0; j < array.length; j++) {
if (order[i] === array[j].UserId) {
arr.push(array[j]);
} else {
arr.push({ id: null, value: null})
}
}
}
array = arr;
}
return arr;
};

您可以从array2生成Map,其中array2中对象的每个id都指向具有特定id值的对象数组。然后,您可以在array1上使用.flatMap(),并通过在地图上使用.get()来获取当前迭代对象的id的所有对象。如果.get()不返回任何内容,则可以提供默认对象(其中id和值为null(:

const array1 = [{id: 4, value:'xyz'}, {id: 2, value:'pqr'}, {id: 5, value:'abc'}];
const array2 = [{id: 5, value:'abc'}, {id: 4, value:'xyz'}];
// group the arrays into a Map
const grouped = array2.reduce((map, obj) => 
map.set(obj.id, (map.get(obj.id) || []).concat(obj)),
new Map
);
const res = array1.flatMap(({id}) => grouped.get(id) || ({id: null, value: null}));
console.log(res);

如果数组2中的对象具有唯一的id值(即:不可能存在具有相同想法的对象(,则可以删除.flatMap()Map中对象数组的需要。如果是这样的话,你可以简化上面的:

const array1 = [{id: 4, value:'xyz'}, {id: 2, value:'pqr'}, {id: 5, value:'abc'}];
const array2 = [{id: 5, value:'abc'}, {id: 4, value:'xyz'}];
const ids = new Map(array2.map((obj) => [obj.id, obj]));
const res = array1.map(({id}) => ids.get(id) || ({id: null, value: null}));
console.log(res);

首先,您可以在第二个数组上循环,并将ID保存到新的集合中,然后在第一个数组上进行循环,如果集合中存在当前项目的ID,则返回当前对象或返回id和值为null的对象`

const array1 = [{id: 4, value:'xyz'}, {id: 2, value:'pqr'}, {id: 5, value:'abc'}]
const array2 = [{id: 5, value:'abc'}, {id: 4, value:'xyz'}]
function test(arr1, arr2) {
const set = new Set()
arr2.forEach(i => set.add(i.id))
return arr1.map((i) => set.has(i.id) ? i : { id: null, value: null })
}
console.log(test(array1,array2))

您可以先在对象中收集对象,然后他们映射收集的对象或使用占位符。

var array1 = [{ id: 4, value: 'xyz' }, { id: 2, value: 'pqr' }, { id: 5, value: 'abc' }],
array2 = [{ id: 5, value: 'abc' }, { id: 4, value: 'xyz' }],
result = array1.map(
(o => ({ id }) => o[id] || { id: null, value: null })
(array2.reduce((r, o) => ({ ...r, [o.id]: o }), {}))
);
console.log(result);
.as-console-wrapper { max-height: 100% !important; top: 0; }

最新更新