Javascript 基于其他贴图和选定值填充贴图
我随身带着一张这样的地图Javascript 基于其他贴图和选定值填充贴图,javascript,Javascript,我随身带着一张这样的地图 k1: ["x", "y"] k2: ["x", "z"] k3: ["x", "y"] k4: ["x", "z"] k5: ["x", "z"] k6: ["k", "a"] k7: ["m", "b"] 我有一个价值清单,就像这样 [["x", "y"], ["x", "z"]] k1: 0 k2: 0 k3: 0 k4: 0 k5: 0 k6: 0 k7: 0 k1: 1 k2: 1 k3: 1 k4: 1 k5: 1 k6: 0 k7: 0 我还有另
k1: ["x", "y"]
k2: ["x", "z"]
k3: ["x", "y"]
k4: ["x", "z"]
k5: ["x", "z"]
k6: ["k", "a"]
k7: ["m", "b"]
我有一个价值清单,就像这样
[["x", "y"], ["x", "z"]]
k1: 0
k2: 0
k3: 0
k4: 0
k5: 0
k6: 0
k7: 0
k1: 1
k2: 1
k3: 1
k4: 1
k5: 1
k6: 0
k7: 0
我还有另一个Map
,它的键与第一个Map的键相同,但值不同,如下所示
[["x", "y"], ["x", "z"]]
k1: 0
k2: 0
k3: 0
k4: 0
k5: 0
k6: 0
k7: 0
k1: 1
k2: 1
k3: 1
k4: 1
k5: 1
k6: 0
k7: 0
如果给定列表中存在第一个映射中特定键的对应值,我想用1
替换第二个映射中键的值
预期输出如下所示
[["x", "y"], ["x", "z"]]
k1: 0
k2: 0
k3: 0
k4: 0
k5: 0
k6: 0
k7: 0
k1: 1
k2: 1
k3: 1
k4: 1
k5: 1
k6: 0
k7: 0
我可以在地图的键上实现多次循环,但我拥有的地图非常大(1M+条目)。我想找到最有效的方法来实现这一点。创建一个临时对象,将列表值存储为O1读取的对象
var listObj=[“val1”,“val2”].reduce((acc,item)=>({…acc,[item]:true}),{})
变量obj1={
k1:“val1”
}
var obj2={k1:0,k2:0,k3:0}
console.log(Object.keys(obj2).reduce((acc,key)=>({…acc[key]:listObj[obj1[key]]?1:0}),{}))
使用集合。只需要一个循环(除了创建valsSet
的隐式循环之外),查找速度不是问题
编辑:问题发生了实质性变化;这个答案也随之改变。编辑是必要的,因为与字符串不同,字符串中的“key2”==“key2”
,具有数组[“x”,“y”]!=[“x”,“y”]
,因此不可能进行简单的设置
查找(valsLookup.has([“x”,“y”])
)
let a = new Map(Object.entries({
k1: ["x", "y"], k2: ["x", "z"], k3: ["x", "y"], k4: ["x", "z"], k5: ["x", "z"], k6: ["k", "a"], k7: ["m", "b"]
}));
let b = new Map(Object.entries({
k1: 0, k2: 0, k3: 0, k4: 0, k5: 0, k6: 0, k7: 0,
}));
let vals = [["x", "y"], ["x", "z"]];
let valsLookup = vals.reduce((m, [x, y], i) => {
let s = m.get(x);
if (!s) m.set(x, s = new Set());
s.add(y);
return m;
}, new Map());
a.forEach(([x, y], i) => {
let vx = valsLookup.get(x);
if (vx && vx.has(y)) b.set(i, 1);
});
console.log(b);
// => Map {
// 'k1' => 1,
// 'k2' => 1,
// 'k3' => 1,
// 'k4' => 1,
// 'k5' => 1,
// 'k6' => 0,
// 'k7' => 0 }
即使是我粘贴在问题中的示例地图,我也无法在我正在处理的实际地图上制作,但我正在更新问题。请稍等,我已经更新了这个问题,实际上我的第一个映射的值是一个包含2个值的数组,这是非常不同的。第一个元素是否总是
“x”
?您是否要求两个元素相等?[“x”,“y”]
是否等于[“y”,“x”]
?第一个数组中的[“x”,“y”]
是否与值列表中的[“x”,“y”]
相关,还是仅相等?这两个元素始终都是字符串吗?都是字符串,并且是顺序特定的,即[“x”,“y”]和[“y”,“x”]不同。第一个元素可以不同。我已更新以显示差异