我有一个对象数组 arr1,其中每个对象都有多个属性。我还有一个映射,map2,其中键是字符串,值可以是任何类型。我的目标是找到 arr1 和 map2 之间的匹配键。
这是我当前拥有的代码示例:
// Assume arr1 is an array of objects, each object having multiple properties
var arr1 = [{Alice: 1, Bob: 2}, {Alice: 2,Charlie: 3, David: 4}, {Charlie: 4,Eve: 5, Frank: 6}];
// Assume map2 is a map, with keys as strings and values of any type
var map2= new Map();
map2.set("Alice", 1);
map2.set("David", 2);
map2.set("Eve", 3);
// Original nested for loop
for (var i = 0; i < arr1.length; i++) {
for (var [key, value] of map2) {
for (var name in arr1[i]) {
if (arr1[i][name] == key) {
arr1[i][name] = map2.get(key)
}
}
}
}
// Optimized nested for loop
for (var i = 0; i < arr1.length; i++) {
for (var name in arr1[i]) {
if (map2.has(name)) {
arr1[i][name] = map2.get(name)
}
}
}
代码按预期工作,但我想知道是否可以进行进一步的优化以提高其效率。目前,我迭代 arr1 并根据 map2 中的键检查每个对象的每个属性。如果找到匹配,则记录匹配的密钥。但是arr1数据量大,map key数量多,效率低下,不知道有没有更好的办法
是否有更有效的方法来达到相同的结果?任何建议或见解将不胜感激。谢谢!
从数组中创建唯一键的Set,从映射中提取键,然后使用filter()删除集合中未包含的任何内容。
const arr1 = [{Alice: 1, Bob: 2}, {Alice: 2,Charlie: 3, David: 4}, {Charlie: 4,Eve: 5, Frank: 6}];
const map2= new Map();
map2.set("Alice", 1);
map2.set("David", 2);
map2.set("Eve", 3);
const arrKeys = new Set(arr1.flatMap(Object.keys));
const matchingKeys = Array.from(map2.keys()).filter((key) => arrKeys.has(key));
console.log(matchingKeys);