如何构建一个比 nodeList 更大的数组,将空字符串作为缺少 类 的占位符?
How to build an array larger than the nodeList, putting empty strings as placeholders for missing classes?
HTML
<div class="1"><div class="2">element1class2</div><div class="3">element1class3</div></div>
<div class="1"><div class="2">element2class2</div></div>
Javascript:
var class2List= document.querySelectorAll('div.class1 div.class2')
var class3List= document.querySelectorAll('div.class1 div.class3')
for (let i = 0; i < class2List.length; i++) {
nodes[i] = {
class2: class2List[i].innerText,
class3: class3list[i].innerText,
}
}
嗨,我想知道是否可以使用 querySelectors 按以下方式制作 HTML 个元素的数组:
我想要 innerText 的输出数组,但是当没有 class 时,要放一个空字符串。
[{class2: 'element1class2', class3: 'element1class3'},
{class2: 'element2class2', class3: ''} ]
现在,如果节点中没有div class="3",那么对于每个不携带class=的元素,NodeList长度减1 "3" div.
class3List 的当前输出是 innerText is not defined for class3list
,因为 class3list 的长度比 class2List 短。
如果元素不存在,则使用可选链接使值为 undefined
,然后在这种情况下使用 ??
与空字符串交替:
class3: class3list[i]?.innerText ?? '',
如果不能使用可选链,可以使用条件运算符:
class3: class3list[i] ? class3list[i].innerText : '',
如果您需要处理中间的“漏洞”,请使用不同的方法:将 <div class="2"
元素映射到它们的下一个兄弟元素:
const nodes = [...document.querySelectorAll('[class="2"]')]
.map(class2 => ({
class2: class2.textContent,
class3: class2.nextElementSibling?.textContent ?? ''
}));
console.log(nodes);
<div class="1">
<div class="2">element1class2</div>
<div class="3">element1class3</div>
</div>
<div class="1">
<div class="2">element2class2</div>
</div>
注意你需要使用[class="2"]
选择器字符串,而不是.class2
,因为你的元素不是class="class2"
,而是class="2"
.
您还需要修复 HTML 的语法。决赛
</div>/div>
应该是
</div></div>
感谢@certainperformance,我通过使用分组选择器 (class1) 找到了解决我的问题的方法,然后将每个数组元素与另一个 querySelector 映射到我正在寻找的 class对于 (class2 或 class3)
例如:
const nodes = [...document.querySelectorAll('[class="2"]')]
感谢 css 选择器 class=2
的提示
nodes.map(node => ({
class2: node.querySelector('[class="2"]') ? node.querySelector('[class="2"]').textContent: '',
class3: node.querySelector('[class="3"]') ? node.querySelector('[class="3"]').textContent: ''
}))
这样我们就可以检查nodeList中每个父节点的父节点下是否存在class。
HTML
<div class="1"><div class="2">element1class2</div><div class="3">element1class3</div></div>
<div class="1"><div class="2">element2class2</div></div>
Javascript:
var class2List= document.querySelectorAll('div.class1 div.class2')
var class3List= document.querySelectorAll('div.class1 div.class3')
for (let i = 0; i < class2List.length; i++) {
nodes[i] = {
class2: class2List[i].innerText,
class3: class3list[i].innerText,
}
}
嗨,我想知道是否可以使用 querySelectors 按以下方式制作 HTML 个元素的数组:
我想要 innerText 的输出数组,但是当没有 class 时,要放一个空字符串。
[{class2: 'element1class2', class3: 'element1class3'},
{class2: 'element2class2', class3: ''} ]
现在,如果节点中没有div class="3",那么对于每个不携带class=的元素,NodeList长度减1 "3" div.
class3List 的当前输出是 innerText is not defined for class3list
,因为 class3list 的长度比 class2List 短。
如果元素不存在,则使用可选链接使值为 undefined
,然后在这种情况下使用 ??
与空字符串交替:
class3: class3list[i]?.innerText ?? '',
如果不能使用可选链,可以使用条件运算符:
class3: class3list[i] ? class3list[i].innerText : '',
如果您需要处理中间的“漏洞”,请使用不同的方法:将 <div class="2"
元素映射到它们的下一个兄弟元素:
const nodes = [...document.querySelectorAll('[class="2"]')]
.map(class2 => ({
class2: class2.textContent,
class3: class2.nextElementSibling?.textContent ?? ''
}));
console.log(nodes);
<div class="1">
<div class="2">element1class2</div>
<div class="3">element1class3</div>
</div>
<div class="1">
<div class="2">element2class2</div>
</div>
注意你需要使用[class="2"]
选择器字符串,而不是.class2
,因为你的元素不是class="class2"
,而是class="2"
.
您还需要修复 HTML 的语法。决赛
</div>/div>
应该是
</div></div>
感谢@certainperformance,我通过使用分组选择器 (class1) 找到了解决我的问题的方法,然后将每个数组元素与另一个 querySelector 映射到我正在寻找的 class对于 (class2 或 class3) 例如:
const nodes = [...document.querySelectorAll('[class="2"]')]
感谢 css 选择器 class=2
的提示nodes.map(node => ({
class2: node.querySelector('[class="2"]') ? node.querySelector('[class="2"]').textContent: '',
class3: node.querySelector('[class="3"]') ? node.querySelector('[class="3"]').textContent: ''
}))
这样我们就可以检查nodeList中每个父节点的父节点下是否存在class。