Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/408.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/performance/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 基于其他贴图和选定值填充贴图_Javascript - Fatal编程技术网

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”]不同。第一个元素可以不同。我已更新以显示差异