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

如何使用JavaScript reduce()方法找出最宽的DOM元素?

解决reduce遍历DOM节点找最宽元素时的类型错误

你判断的错误原因完全正确:reduce回调每次返回的是Math.max计算出的数值,而非DOM节点。下一轮迭代时,参数a变成了这个数值,调用get_elementWidth(a)自然会报错——数值没有getBoundingClientRect方法。

解决方案1:让reduce始终返回DOM节点

修改get_widestElemet函数,在回调中比较两个节点的宽度,保留更宽的那个DOM节点:

function get_elementWidth(ELEMENT) {
  const DOMrect = ELEMENT.getBoundingClientRect();
  return DOMrect.width;
}

function get_widestElemet(ELEMENTS) {
  return ELEMENTS.reduce((prevEl, currEl) => {
    const prevWidth = get_elementWidth(prevEl);
    const currWidth = get_elementWidth(currEl);
    // 返回宽度更大的节点
    return prevWidth > currWidth ? prevEl : currEl;
  });
}

const elements = document.querySelectorAll('.ElementGroup__element');
const widestElement = get_widestElemet([...elements]);
console.log('最宽的DOM节点:', widestElement);
console.log('其宽度:', get_elementWidth(widestElement));

解决方案2:先提取宽度数组再找最大值

这种方式更直观,避免reduce中的类型混淆:

function get_elementWidth(ELEMENT) {
  const DOMrect = ELEMENT.getBoundingClientRect();
  return DOMrect.width;
}

function get_widestElemet(ELEMENTS) {
  // 先把所有元素的宽度转换成数值数组
  const widthList = ELEMENTS.map(el => get_elementWidth(el));
  // 展开数组找最大值
  return Math.max(...widthList);
}

const elements = document.querySelectorAll('.ElementGroup__element');
console.log('最大宽度数值:', get_widestElemet([...elements]));

完整可运行代码示例

<div class="ElementGroup">
  <span class="ElementGroup__element">Short Element</span>
  <span class="ElementGroup__element">Short Element</span>
  <span class="ElementGroup__element">Looooooooooong Element</span>
</div>

<style>
.ElementGroup {
  display: flex;
  flex-direction: column;
}
</style>

<script>
function get_elementWidth(ELEMENT) {
  const DOMrect = ELEMENT.getBoundingClientRect();
  return DOMrect.width;
}

function get_widestElemet(ELEMENTS) {
  return ELEMENTS.reduce((prevEl, currEl) => {
    const prevWidth = get_elementWidth(prevEl);
    const currWidth = get_elementWidth(currEl);
    return prevWidth > currWidth ? prevEl : currEl;
  });
}

const elements = document.querySelectorAll('.ElementGroup__element');
const widestEl = get_widestElemet([...elements]);
console.log('最宽元素:', widestEl);
console.log('宽度:', get_elementWidth(widestEl));
</script>

内容的提问来源于stack exchange,提问作者JoSch

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.15 04:15:37