在 javascript 中按对象引用进行哈希处理

Hash by object reference in javascript

本文关键字:哈希 处理 对象引用 javascript      更新时间:2023-09-26

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

也许您想通过 DOM 节点的哈希值或按构造对象的实例或许多其他内容对 ul 的子节点进行分组。

我已经读过这篇文章,在它们稳定之前不想使用弱图。

我能想到的唯一方法是将父项存储在数组中并在那里强制执行引用唯一性,然后按数组中引用的索引进行哈希处理。(例如查找 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);
}

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

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

您可以使用 <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];
}