Map.delete() 无法处理父 Map 中的键
Map.delete() not working on key in parent Map
我现在正在做的是删除任何不包含该字符串的 diff,如果 diff 的字典为空,那么我会尝试删除地图。
这里的问题是,由于某些原因(控制台中没有错误)我无法删除带有 data.delete(map)
的地图,并且 if 语句中删除之后的任何代码都不会 运行。
这里是有问题的代码:
var data = new Map({"593620 Linked Horizon - Shinzou o Sasageyo! [TV Size]": {"difficulties": {"Titan": 86813}}, "859608 LiSA - ADAMAS (TV Size)": {"difficulties": {"Kibbleru's Blue Rose": 899}},"940746 CHiCO with HoneyWorks - Kimi ga Sora Koso Kanashikere": {"difficulties": {"Taeyang's Extra": 72321}}});
var string = "titan";
Array.from(data.keys()).forEach(function(map) {
if (!(map.toLowerCase().indexOf(string.toLowerCase()) >=0)) {
if (document.getElementById("diff_search_box").checked) {
Array.from(data.get(map).get("difficulties").keys()).forEach(function(diff) {
if (!(diff.toLowerCase().indexOf(string) >= 0)) {
data.get(map).get("difficulties").delete(diff)
}
})
if (Array.from(data.get(map).get("difficulties").keys()).length = 0) {
data.delete(map)
}
}
}
})
在这种情况下,我应该得到一个字典,例如:
{
"593620 Linked Horizon - Shinzou o Sasageyo! [TV Size]": {
"difficulties": {"Titan": 86813}
}
}
Map 需要像传递给它的数组一样的可迭代对象,例如:
new Map([['Key 1', 'Value 1'], ['Key 1', 'Value 1']])
您不能将对象文字传递给它,但您可以轻松地使用 Object.entries()
从对象中提取所需的数组。
然后你可以使用Map.prototype.forEach()
遍历所有的Map条目
var data = {"593620 Linked Horizon - Shinzou o Sasageyo! [TV Size]": {"difficulties": {"Titan": 86813}}, "859608 LiSA - ADAMAS (TV Size)": {"difficulties": {"Kibbleru's Blue Rose": 899}},"940746 CHiCO with HoneyWorks - Kimi ga Sora Koso Kanashikere": {"difficulties": {"Taeyang's Extra": 72321}}};
const map = new Map(Object.entries(data));
map.forEach((value, key) =>{
const {difficulties} = value;
console.log('Map key:', key.toLowerCase());
// if(someCondition){
// map.delete(key)
// }
Object.entries(difficulties).forEach(([k,v])=>{
console.log('Diff key:', k, ' Diff value:', v)
// if(k.toLowerCase().includes('titan')){
// delete difficulties[key];
// }
})
console.log('*****************************')
})
此代码存在大量问题。我的建议是,如果不先 运行 确保它能正常工作,就不要写太多代码。一次写一小段,运行边写边确保一切正常。
第一个问题是您不能使用这样的对象初始化地图。必须使用数组的数组初始化 Map,每个数组的长度为两个元素,每个元素都包含映射的键值对。您可以通过将对象包装在 Object.entries()
中来解决此问题,因为这将 return 对象的键值对。
第二个问题是 titan
是一个字符串所以它应该是 "titan"
.
第三,您正在 data.get(map).get("difficulties")
行中的一个对象上调用 .get
。对象没有 .get
,你必须使用括号或点语法:data.get(map).difficulties
或 data.get(map).difficulties
.
第四,我认为您实际上并不想从地图中删除数据。如果这样做,当用户更改搜索文本时,旧数据仍然会消失。
你为什么还要用地图?你可以简单地使用一个普通的对象。
如果你必须使用地图,就这样做:
var data = new Map(Object.entries({
"593620 Linked Horizon - Shinzou o Sasageyo! [TV Size]": {
"difficulties": {"Titan": 86813}
},
"859608 LiSA - ADAMAS (TV Size)": {
"difficulties": {"Kibbleru's Blue Rose": 899}
},
"940746 CHiCO with HoneyWorks - Kimi ga Sora Koso Kanashikere": {
"difficulties": {"Taeyang's Extra": 72321}
}
}));
var string = 'titan';
function search(s) {
var r = {};
for( const [key, value] of data ) {
for( const diffKey in value.difficulties ) {
if(diffKey.toLowerCase().indexOf(string) != -1)
r[key] = value;
}
}
return new Map(Object.entries(r));
}
有了这个功能,你可以search(string)
,它会return你原来想要的地图。
主要是你应该写一堆代码而不用 运行ning 任何东西。
惊讶地看到 none 之前的回答看到,不和谐服务器上的另一个人我支持软件的东西指出了最后的 if 条件和它缺少 =
的事实所以它显示为
if (Array.from(data.get(map).get("difficulties").keys()).length == 0) {
// was = before, == now
data.delete(map)
}
所以现在我确实获得了一个数据字典,其中只有 1 个元素包含地图,该地图也具有指定字符串中包含的难度。
我现在正在做的是删除任何不包含该字符串的 diff,如果 diff 的字典为空,那么我会尝试删除地图。
这里的问题是,由于某些原因(控制台中没有错误)我无法删除带有 data.delete(map)
的地图,并且 if 语句中删除之后的任何代码都不会 运行。
这里是有问题的代码:
var data = new Map({"593620 Linked Horizon - Shinzou o Sasageyo! [TV Size]": {"difficulties": {"Titan": 86813}}, "859608 LiSA - ADAMAS (TV Size)": {"difficulties": {"Kibbleru's Blue Rose": 899}},"940746 CHiCO with HoneyWorks - Kimi ga Sora Koso Kanashikere": {"difficulties": {"Taeyang's Extra": 72321}}});
var string = "titan";
Array.from(data.keys()).forEach(function(map) {
if (!(map.toLowerCase().indexOf(string.toLowerCase()) >=0)) {
if (document.getElementById("diff_search_box").checked) {
Array.from(data.get(map).get("difficulties").keys()).forEach(function(diff) {
if (!(diff.toLowerCase().indexOf(string) >= 0)) {
data.get(map).get("difficulties").delete(diff)
}
})
if (Array.from(data.get(map).get("difficulties").keys()).length = 0) {
data.delete(map)
}
}
}
})
在这种情况下,我应该得到一个字典,例如:
{
"593620 Linked Horizon - Shinzou o Sasageyo! [TV Size]": {
"difficulties": {"Titan": 86813}
}
}
Map 需要像传递给它的数组一样的可迭代对象,例如:
new Map([['Key 1', 'Value 1'], ['Key 1', 'Value 1']])
您不能将对象文字传递给它,但您可以轻松地使用 Object.entries()
从对象中提取所需的数组。
然后你可以使用Map.prototype.forEach()
遍历所有的Map条目
var data = {"593620 Linked Horizon - Shinzou o Sasageyo! [TV Size]": {"difficulties": {"Titan": 86813}}, "859608 LiSA - ADAMAS (TV Size)": {"difficulties": {"Kibbleru's Blue Rose": 899}},"940746 CHiCO with HoneyWorks - Kimi ga Sora Koso Kanashikere": {"difficulties": {"Taeyang's Extra": 72321}}};
const map = new Map(Object.entries(data));
map.forEach((value, key) =>{
const {difficulties} = value;
console.log('Map key:', key.toLowerCase());
// if(someCondition){
// map.delete(key)
// }
Object.entries(difficulties).forEach(([k,v])=>{
console.log('Diff key:', k, ' Diff value:', v)
// if(k.toLowerCase().includes('titan')){
// delete difficulties[key];
// }
})
console.log('*****************************')
})
此代码存在大量问题。我的建议是,如果不先 运行 确保它能正常工作,就不要写太多代码。一次写一小段,运行边写边确保一切正常。
第一个问题是您不能使用这样的对象初始化地图。必须使用数组的数组初始化 Map,每个数组的长度为两个元素,每个元素都包含映射的键值对。您可以通过将对象包装在 Object.entries()
中来解决此问题,因为这将 return 对象的键值对。
第二个问题是 titan
是一个字符串所以它应该是 "titan"
.
第三,您正在 data.get(map).get("difficulties")
行中的一个对象上调用 .get
。对象没有 .get
,你必须使用括号或点语法:data.get(map).difficulties
或 data.get(map).difficulties
.
第四,我认为您实际上并不想从地图中删除数据。如果这样做,当用户更改搜索文本时,旧数据仍然会消失。
你为什么还要用地图?你可以简单地使用一个普通的对象。
如果你必须使用地图,就这样做:
var data = new Map(Object.entries({
"593620 Linked Horizon - Shinzou o Sasageyo! [TV Size]": {
"difficulties": {"Titan": 86813}
},
"859608 LiSA - ADAMAS (TV Size)": {
"difficulties": {"Kibbleru's Blue Rose": 899}
},
"940746 CHiCO with HoneyWorks - Kimi ga Sora Koso Kanashikere": {
"difficulties": {"Taeyang's Extra": 72321}
}
}));
var string = 'titan';
function search(s) {
var r = {};
for( const [key, value] of data ) {
for( const diffKey in value.difficulties ) {
if(diffKey.toLowerCase().indexOf(string) != -1)
r[key] = value;
}
}
return new Map(Object.entries(r));
}
有了这个功能,你可以search(string)
,它会return你原来想要的地图。
主要是你应该写一堆代码而不用 运行ning 任何东西。
惊讶地看到 none 之前的回答看到,不和谐服务器上的另一个人我支持软件的东西指出了最后的 if 条件和它缺少 =
的事实所以它显示为
if (Array.from(data.get(map).get("difficulties").keys()).length == 0) {
// was = before, == now
data.delete(map)
}
所以现在我确实获得了一个数据字典,其中只有 1 个元素包含地图,该地图也具有指定字符串中包含的难度。