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).difficultiesdata.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 个元素包含地图,该地图也具有指定字符串中包含的难度。