为何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'}
问题原因
- 判断逻辑完全颠倒:原代码把忽略列表的第一个元素(class)加入Map,而需求是要排除忽略列表内的属性,收集不在列表中的data属性。
- 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
相关产品推荐
相关产品推荐

