【发布时间】:2014-10-12 01:30:23
【问题描述】:
有人需要在 javascript 中通过对象引用来散列吗?
也许您想通过 uls 的 DOM 节点的哈希值或构造对象实例的属性或许多其他东西对子级进行分组。
我已阅读 this 并且不想使用 Weakmap,直到它们稳定为止。
我能想到的唯一方法是将父母存储在一个数组中并在那里强制引用唯一性,然后通过数组中引用的索引进行散列。 (示例是查找 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);
}
有没有更好的方法来存储附加到对象实例的属性或子对象或其他东西,而不将它们添加为对象本身的属性?
【问题讨论】:
-
你能给出所有元素的ID吗?然后你可以使用 ID 作为哈希键。
-
如果你愿意使用 jQuery,它的
.data()方法几乎可以实现你想要的。 -
是的——实现我自己的
.data()版本几乎是这个想法:) -
你可能想看看jQuery是如何实现它的。
标签: javascript hash map