You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为何JS三元运算符未按预期执行map.set(),忽略条件判断?

问题:将元素data属性映射到另一个元素时忽略指定属性失败

需求是将一个元素的data-属性映射到另一个元素,但忽略class、id等特定属性,当前代码无法实现预期效果。

错误代码

let ignoreList = ['class', 'id', 'name', 'value', 'type', 'src'];
$(".some-class").on("click",function(event) {
    let attrMap = new Map();
    let attrs = event.target.attributes;
    $.each(attrs, function(e){
        console.log(`"${this.name}" is in ignoreList: ` + (ignoreList.indexOf(this.name) == 0).toString());
        ignoreList.indexOf(this.name) == 0 ? attrMap.set(this.name, this.value) : null;
    });
    console.log(attrs);
    console.log(attrMap);
});

预期控制台输出

"class" is in ignoreList: true
"data-one" is in ignoreList: false
"data-two" is in ignoreList: false
"data-three" is in ignoreList: false
"data-four" is in ignoreList: false
"data-five" is in ignoreList: false
"data-six" is in ignoreList: false

NamedNodeMap {0: class, 1: data-one, 2: data-two, 3: data-three, 4: data-four, 5: data-five, 6: data-six, class: class, data-one: data-one, data-two: data-two, data-three: data-three, data-four: data-four, …}

Map(6) {'data-one' => 'Lorem ipsum', 'data-two' => 'dolor sit amet', 'data-three' => 'purto ludus', 'data-four' => 'indoctum sit', …}

实际控制台输出(省略重复值)

Map(1) {'class' => 'some-class'}

问题原因

  1. 判断逻辑完全颠倒:原代码把忽略列表的第一个元素(class)加入Map,而需求是要排除忽略列表内的属性,收集不在列表中的data属性。
  2. indexOf判断错误:indexOf == 0仅匹配数组第一个元素,忽略列表里的id、name等其他属性会被误判为不在列表中,同时data属性因逻辑反转无法被加入Map。

修正后的代码

let ignoreList = ['class', 'id', 'name', 'value', 'type', 'src'];
$(".some-class").on("click",function(event) {
    let attrMap = new Map();
    let attrs = event.target.attributes;
    $.each(attrs, function(){
        // 只收集不在忽略列表中且以data-开头的属性
        const isIgnored = ignoreList.includes(this.name);
        console.log(`"${this.name}" is in ignoreList: ${isIgnored}`);
        
        if (!isIgnored && this.name.startsWith('data-')) {
            attrMap.set(this.name, this.value);
        }
    });
    console.log(attrs);
    console.log(attrMap);
});

修正说明

  • 用ignoreList.includes(this.name)替代indexOf == 0,准确判断属性是否在忽略列表中
  • 反转逻辑:只有不在忽略列表且是data-开头的属性才加入Map,完全符合需求
  • 代码可读性提升,逻辑更清晰

内容的提问来源于stack exchange,提问作者brian-welch

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.03 23:11:11