查询选择交替元素

问题描述

我有以下 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>