属性排序找出最大,并在相应li上添加样式

本文介绍了一种使用JavaScript和jQuery的方法来查找并显示HTML列表中带有最大数值tag属性的元素。通过使用Math.max结合apply、map及filter等方法,实现了筛选出具有最大tag属性值的列表项,并使这些项中的特定元素可见。

直接上代码

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
    <style>
        .hot{
            display: none;
        }
    </style>
</head>
<body>
<ul class="Classroom_list">
    <li tag="1">
        <span class="hot"></span>
    </li>
    <li tag="2">
        <span class="hot"></span>
    </li>
    <li tag="4">
        <span class="hot"></span>
    </li>
    <li tag="4">
        <span class="hot"></span>
    </li>
</ul>
<script>
    //方法一
    var $lis = $(".Classroom_list li");
    var max = Math.max.apply(null,$lis.toArray().map(function(li){ return +$(li).attr("tag")}));
    $lis.filter("[tag=" + max + "]").find(".hot").css("display","block");
    //方法二
    $('<style>[tag="' + Math.max.apply(null, $(".Classroom_list li").toArray()
        .map(function(li){ return +$(li).attr("tag")})) + '"] .hot{ display:block !important;}</style>').appendTo('head');
    //方法三
    $('<style>[tag="' + $(".Classroom_list li").toArray().reduce(function(max,cur){ return +$(cur).attr("tag") > max ? +$(cur).attr("tag") : max; }, 0) + '"] .hot{ display:block !important;}</style>').appendTo('head');
    //ECM6语法
    //$('<style>[tag="' + Math.max(...$(".Classroom_list li").toArray().map(p => +$(p).attr("tag"))) + '"] .hot{ display:block !important;}</style>').appendTo('head');
</script>
</body>
</html>
用的的知识点有,filter Math.max apply toArray map reduce 字符串拼接 appendTo等基础知识
<h3>题目背景</h3><p>层叠样式表(Cascading Style Sheets,简写 CSS)是一种用来为结构化文档(如 HTML 文档)添加样式(字体、间距和颜色等)的计算机语言。</p><p>例如,对于以下的 HTML 文档:</p><pre><code ><html>   <head>     <title>Sample</title>   </head>   <body>     <h1>Hello</h1>     <p id="subtitle">Greetings</div>     <p>Hello, world!</p>   </body> </html> </code></pre><p><span style="color: rgb(51, 51, 51); background-color: rgb(255, 255, 255);">配合以下 CSS 片段可以为其中的标题和段落设置相应的格式:</span></p><pre><code >h1 { font-weight: bold; } #subtitle { font-size: 12px; } </code></pre><p>这段 CSS 片段为前面 HTML 文档添加样式,使得标题“Hello”(第 6 行 <span style="color: rgb(199, 37, 78); background-color: rgb(249, 242, 244);"><code><h1></code></span> 和 <span style="color: rgb(199, 37, 78); background-color: rgb(249, 242, 244);"><code></h1></code></span> 标签之间的内容)具有粗体,使得段落“Greetings”(第 7 行 <span style="color: rgb(199, 37, 78); background-color: rgb(249, 242, 244);"><code><p id="subtitle"></code></span> 和 <span style="color: rgb(199, 37, 78); background-color: rgb(249, 242, 244);"><code><\p></code></span> 标签之间的内容)具有 12 个像素的字体大小。 这里,CSS 片段第 1 行中出现的 h1 是一个选择器,它选中了 HTML 文档第 6 行的 h1 元素。 CSS 片段第 2 行中出现的 #subtitle 也是一个选择器,选中了 HTML 文档第 7 行 id 属性为 subtitle 的 p 元素。 注意它没有选中 HTML 文档第 8 行不带属性的 p 元素。</p><h3>题目描述</h3><p>本题要实现一个简化版的元素选择器。 给出一个结构化文档,和若干个选择器,对每个选择器找出文档中所对应选中的元素。</p><h4>结构化文档</h4><p>结构化文档由元素组成,一个元素可以包含若干个子元素(可以没有)。 一个文档有一个根元素,在整体上形成树的结构。 以下是本题结构化文档的一个例子:</p><pre><code >html ..head ....title ..body ....h1 ....p #subtitle ....div #main ......h2 ......p </code></pre><ul><li>文档中每行表示一个元素,元素的标签由一个或者多个字母或数字组成。</li><li>元素可以附加一个 id 属性属性值也是由一个或者多个字母或数字组成,之前有一个井号 #。如果元素有 id 属性,标签和属性之间用一个空格字符分隔。</li><li>标签之前的缩进表示元素之间的包含关系:一个元素 E 所在行之后连续的缩进更深的行代表的元素是元素 E 的后代元素,其中缩进恰好深一层的是元素 E 的子元素。为了便于观察,每一级缩进用两个小数点符号 .. 表示。</li></ul><h4>选择器</h4><p>本题中会出现的选择器有三种,分别为:</p><ul><li>标签选择器:用标签来表示。例如 p 表示选择标签为 p 的所有元素。</li><li>id 选择器:用 id 属性来表示。例如 #main 表示选择 id 属性为 main 的所有元素。</li><li>后代选择器:复合表达式,格式为 A B,其中 A 和 B 均为标签选择器或 id 选择器,中间用一个空格字符分隔,表示选择满足选择器 B 的所有元素,且满足这些元素有祖先元素满足选择器 A。例如,选择器 div p 在上面的文档中会选中最后一行的元素 p,但不会选中 id 属性为 subtitle 的那个元素 p。注意,后代选择器可以有更多的组成部分构成。</li></ul><h3>输入格式</h3><p>输入第一行是两个正整数 n 和 m,分别表示 HTML 文档的行数,和待查询的 CSS 选择器的个数,中间用一个空格字符分隔。</p><p>第 2 行至第 n+1 行给出 HTML 文档。</p><p>第 n+2 行至第 n+m+1 行每行给出一个待查询的 CSS 选择器。记第 n+1+i 行的 CSS 选择器为si​,1≤i≤m。</p><p>保证输入的结构化文档和待查询的选择器都是合法的。</p><h3>输出格式</h3><p>输出共 m行,每行有若干个整数。</p><p>第 i 行表示选择器 si 选中的结果(1≤i≤m )。 其中第一个整数 ri 表示 si 选中的元素个数。 随后 ri 个整数,分别表示选中元素在结构化文档中出现的行号(行号从 1  开始编号)。</p><p>行号按从小到大排序,相邻整数之间用一个空格字符分隔。</p><h3>样例解释</h3><p>对丁样例中查询的5个选择器:</p><ol><li><span style="color: rgb(199, 37, 78); background-color: rgb(249, 242, 244);"><code>p</code></span>选中所有的元素<span style="color: rgb(199, 37, 78); background-color: rgb(249, 242, 244);"><code>p</code></span>;</li><li><span style="color: rgb(199, 37, 78); background-color: rgb(249, 242, 244);"><code>#subtitle</code></span> 选中第 6 行 id 属性为 subtitle 的元素 <span style="color: rgb(199, 37, 78); background-color: rgb(249, 242, 244);"><code>p</code></span>;</li><li>由于没有标签为 <span style="color: rgb(199, 37, 78); background-color: rgb(249, 242, 244);"><code>h3</code></span> 的元素,因此 <span style="color: rgb(199, 37, 78); background-color: rgb(249, 242, 244);"><code>h3</code></span> 没有选中任何元素;</li><li>第 9 行和第 11 行的 <span style="color: rgb(199, 37, 78); background-color: rgb(249, 242, 244);"><code>p</code></span> 元素都有祖先是 <span style="color: rgb(199, 37, 78); background-color: rgb(249, 242, 244);"><code>div</code></span> 元素,而第6行的 <span style="color: rgb(199, 37, 78); background-color: rgb(249, 242, 244);"><code>p</code></span> 元素没有祖先是 <span style="color: rgb(199, 37, 78); background-color: rgb(249, 242, 244);"><code>div</code></span> 元素;</li><li><span style="color: rgb(199, 37, 78); background-color: rgb(249, 242, 244);"><code>div div p</code></span>要求选中的<span style="color: rgb(199, 37, 78); background-color: rgb(249, 242, 244);"><code>p</code></span> 元素有两级祖先都是 <span style="color: rgb(199, 37, 78); background-color: rgb(249, 242, 244);"><code>div</code></span> 元素,只有第 11 行的<span style="color: rgb(199, 37, 78); background-color: rgb(249, 242, 244);"><code>p</code></span>元素满足这个条件。</li></ol><h3>数据规模和约定</h3><ul><li>1≤n≤100</li><li>1≤m≤10</li><li>结构化文档和待查询的选择器每行长度不超过 80个字符(不包括换行符)。保证输入的结构化文档和待查询的选择器都是合法的。</li></ul><p><img src="https://kaoji100.com/images/578/3-1.png" alt="" data-href="" style=""/></p><h3>提示</h3><p>多级的后代选择器在匹配时,可以采用贪心的策略:除最后一级外,前面的部分都可以尽量匹配层级小的元素。</p> 用C++解决
最新发布
07-31
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值