gpt4 book ai didi

javascript - 在 javascript 中按对象引用哈希

转载 作者:行者123 更新时间:2023-11-29 21:58:07 25 4
gpt4 key购买 nike

有人需要在 javascript 中通过对象引用进行哈希处理吗?

也许您想通过 DOM 节点的散列对 ul 的子级进行分组,或者通过构造对象的实例对属性进行分组,或者许多其他事情。

我已阅读 this并且在 Weakmaps 稳定之前不想使用它们。

我能想到的唯一方法是将父项存储在一个数组中并在那里强制引用唯一性,然后通过数组中引用的索引进行散列。 (示例是查找 LI 的所有常见 UL 父代):

var lis = document.getElementsByTagName('li'); // Get all objects
var parent, key, li;
for (var i=0; i<lis.length; i++ ) { // For every LI
storeItemByParent(lis[i], lis[i].parentNode);
}

var parents = [];
var itemsByParent = {};
function storeItemByParent (item, parent){
var key;

// Does this parent already exist? if so, use that index as the hash key
for (var j=0; j<parents.length; j++) {
if(parents[j] === parent) {
key = j;
break;
}
}

// This is a new parent? If so, track it and use that index as the hash key
if (key == undefined) {
parents.push(parent);
key = parents.length;
}

// Finally! The lis in a hash by parent "id".
itemsByParent[key] = itemsByParent[key] || [];
itemsByParent[key].push(item);
}

有没有更好的方法来存储附加到对象实例的属性或子项或其他内容,而不将它们添加为对象本身的属性?

最佳答案

你的方法几乎是正确的,尽管我会把它很好地包装在一个界面后面,用我自己的 add 完成和 find方法。

您可以使用 <array>.indexOf 来简化您的编码,在所有现代浏览器中均受支持,并在需要时轻松填充。

但是您的方法有一个缺点:

如果从 DOM 中删除一个元素,该元素将不会被垃圾回收,因为您的数组仍然持有对它的引用。

当然,虽然这不是一个阻碍,但值得牢记。

但是,您也可以采用一种完全不同的方法。可能不会更好 -- 但不同。

请原谅代码中的任何小错误,我是徒手输入的:

function elementDataHash = {};
function setElementData(el, data) {
var hash = el.getAttribute("data-element-hash");
if !(hash) {
// http://stackoverflow.com/questions/6860853/generate-random-string-for-div-id
hash = generateRandomString();
el.setAttribute("data-element-hash", hash);
}

elementDataHash[hash] = data;
}

function getElementData(el) {
var hash = el.getAttribute("data-element-hash");
return elementDataHash[hash];
}

关于javascript - 在 javascript 中按对象引用哈希,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25375101/

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