gpt4 book ai didi

javascript - 通过数据属性数组过滤jquery对象

转载 作者:行者123 更新时间:2023-12-03 04:11:32 24 4
gpt4 key购买 nike

是否有一种更简单、更好或更干净的方法来过滤利用保存数组的 data- 属性的元素列表?

目前,我们有一个很大的项目列表,每个项目在存储在“data-tags”属性中的数组中包含 1 个或多个标签,如下所示:

<div class="viewItem" data-tags='[{"id":1,"name":"Tag 01"},{"id":2,"name":"Tag 02"}]'></div>
<div class="viewItem" data-tags='[{"id":2,"name":"Tag 02"}]'></div>
<div class="viewItem" data-tags='[{"id":1,"name":"Tag 01"},{"id":3,"name":"Tag 03"}]'></div>

该对象仅显示 data-tags 数组中具有特定标签的 div。下面的代码可以工作,但是我觉得在处理大量项目时效率非常低,并且希望找到更好的答案,无论是使用jquery过滤器还是grep还是其他东西。

$(function () {
//Instantiate variables
var $viewItems = $('.viewItem');
var filterId = 2;

//Hide all items in object array.
$viewItems.hide();

//Loop thru EACH item and show only those with matching id in array
$viewItems.each(function () {
var thisItem = $(this);
var array = thisItem.data("tags");

$.each(array, function (i, obj) {
if (obj.id == filterId) { thisItem.show(); return false; }
});
});
});

最佳答案

首先,data 方法相当快:jQuery 仅在第一次访问时从 DOM 读取值,然后将值(在本例中为对象)保留在内存中,并且将不再读取DOM的数据属性。

因此,如果这些 JSON 值不是很大,则按 id 过滤项目将不会是花费大部分时间的部分。最耗时的部分是调用 .hide().show() 的地方,因为它涉及与 DOM 的交互和渲染。

但是,如果您确实需要优化它,您可以进行一些预处理并通过此 JSON id 值对元素进行键控,例如如下所示:

$(function () {
// Pre-processing: key all viewItems by the id in their data-tags:
var hash = $('.viewItem').get().reduce(function (hash, div) {
return $(div).data("tags").reduce(function (hash, o) {
hash[o.id] = (hash[o.id] || []).concat(div);
return hash;
}, hash);
}, {});

// Actual filtering
$('#apply').click(function() {
var filterId = $('#filter').val();
$('.viewItem').hide();
$(hash[filterId]).show();
});
});
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
Filter ID: <input id="filter"><button id="apply">Apply</button><br>

<div class="viewItem" data-tags='[{"id":1,"name":"Tag 01"},{"id":2,"name":"Tag 02"}]'>1,2</div>
<div class="viewItem" data-tags='[{"id":2,"name":"Tag 02"}]'>2</div>
<div class="viewItem" data-tags='[{"id":1,"name":"Tag 01"},{"id":3,"name":"Tag 03"}]'>1,3</div>

命令式替代方案

由于创建哈希的功能方法可能看起来令人困惑,因此我在这里提供了强制替代方案。但生成的哈希对象将完全相同:

$(function () {
// Pre-processing: key all viewItems by the id in their data-tags:
var hash = [];
$('.viewItem').each(function (i, div) {
$.each($(div).data("tags"), function (j, obj) {
if (!(obj.id in hash)) hash[obj.id] = [];
hash[obj.id].push(div);
});
});

// Actual filtering
$('#apply').click(function() {
var filterId = $('#filter').val();
$('.viewItem').hide();
$(hash[filterId]).show();
});
});
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
Filter ID: <input id="filter"><button id="apply">Apply</button><br>

<div class="viewItem" data-tags='[{"id":1,"name":"Tag 01"},{"id":2,"name":"Tag 02"}]'>1,2</div>
<div class="viewItem" data-tags='[{"id":2,"name":"Tag 02"}]'>2</div>
<div class="viewItem" data-tags='[{"id":1,"name":"Tag 01"},{"id":3,"name":"Tag 03"}]'>1,3</div>

关于javascript - 通过数据属性数组过滤jquery对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44316022/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com