作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我想实现一个ObjectSet类,它包含一组对象引用。在下面的实现 1 中,我使用数组来存储对象。在 put/remove 函数中,我迭代整个数组以查找传入的对象。集合的大小会非常大并且函数被频繁调用。迭代的性能是一个值得关注的问题。
在实现 2 中,我使用一个对象(充当映射)来存储对象引用。通过这种方式,不需要迭代 put/remove 函数中的所有对象。性能会更好。但Object属性必须是字符串。我无法使用该对象作为 key 。问题是:是否有任何算法可以为对象生成唯一 key ?
实现 1 - 将对象引用存储在数组中
function ObjectSet() {
this.store = []; // Array
}
ObjectSet.prototype = {
put: function( obj) {
var store = this.store;
for (var i = 0; i < store.length; i++) {
if (store[i] === obj) {
return;
}
};
},
remove: function( obj ) {
var store = this.store;
for (var i = 0; i < store.length; i++) {
if (store[i] === obj) {
store.splice(i, 1);
}
};
}
};
实现 2 - 将对象引用存储在对象中
function ObjectSet() {
this.store = {}; // Object
}
ObjectSet.prototype = {
put: function( obj) {
var key = generateKeyFromObject(obj);
if(!this.store[ key ]){
this.store[ key ] = obj;
}
},
remove: function( obj ) {
var key = generateKeyFromObject(obj);
if(this.store[ key ]){
delete this.store[ key ];
}
}
};
function generateKeyFromObject(obj){
// Question: How to generate a unique key for an object?
}
============更新2014年7月2日================
根据答案/评论粘贴我的实现。
// Use the global index to avoid the clash when the same object is added to different sets.
var index = 1, key='##key';
function generateKeyFromObject(obj){
if(!obj[key]){
var uniqueKey="##uniqueKey" + (index++).toString();
Object.defineProperty(obj, key, {
writable: false,
enumerable: false,
configurable: false,
value: uniqueKey
});
}
return obj[key];
}
最佳答案
如果向要插入的对象添加属性没有问题:
function ObjectSet()
{
var id = 0;
this.nextId = function() { // id generator function
return ++id;
};
this.store = {}; // Object
}
ObjectSet.prototype = {
put: function(obj) {
if (!obj.id) {
obj.id = this.nextId();
this.store[obj.id] = obj;
}
},
remove: function(obj) {
if (obj.id && this.store[obj.id]) {
delete this.store[key];
}
}
};
正如评论中指出的,如果对象可以在集合之间共享,这将成为一个问题;在这种情况下,所有使用的对象都需要使用相同的 id 生成器。
var nextId = function() {
var id = 0;
return function() {
return ++id;
};
}();
关于javascript - 如何为 JavaScript 对象生成 key ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24525200/
我是一名优秀的程序员,十分优秀!