问题描述
我有以下 HTML。我需要将文本内容提取到一组地图中,例如:
[{key: 'keyone',value: 'valone'},{key: 'keytwo',value: 'valtwo'},... ]
我能想到的唯一方法是使用 document.querySelectorAll('ol *');
提取所有元素,然后遍历每个元素并有一些规则,例如如果它是奇数,则将其添加为键,并将以下元素作为值,然后跳过下一个元素。但这似乎真的很脆弱。有一个更好的方法吗?也许使用像 :nth-last-of-type(2)
这样的 css 选择器?
<ol>
<dt>keyone</dt>
<dd>valone</dd>
<dt>keytwo</dt>
<dd>valtwo</dd>
...
</ol>
解决方法
假设一致的 dt-dd
对,您可以映射 dt 并使用 nextElementSibling 来获取关联的 dd
const dt = document.querySelectorAll( "ol dt" )
const res = [...dt].map(el => {
return {key: el.textContent,value: el.nextElementSibling.textContent}
});
console.log( res );
<ol>
<dt>keyone</dt>
<dd>valone</dd>
<dt>keytwo</dt>
<dd>valtwo</dd>
</ol>
可以选择所有元素,然后使用reduce得到想要的结果
const allNestedElements = [...document.querySelectorAll( "ol > *" )]
const result = allNestedElements.reduce( ( acc,curr,i ) => {
if(i % 2) acc[acc.length - 1].value = curr.textContent;
else acc.push({ key: curr.textContent })
return acc;
},[] );
console.log( result );
<ol>
<dt>keyone</dt>
<dd>valone</dd>
<dt>keytwo</dt>
<dd>valtwo</dd>
</ol>