这就是我需要的:
var user = {
'White' : 24,
'Jack' : 25,
'Jone' : 24,
……
}
在这个对象中,我想存储一个人的姓名和年龄。而obj只能存储10个人。如果添加了第11个人,则应删除第一个人。 所以我想到了一个数组,即unshift和pop方法:
var user = [
{'White': 24},
{'Jack' : 25},
{'Jone' : 24},
……
]
user.unshif({'Bob': 24});
if(user.length>10){user.pop()};
除了一个问题,这个工作正常。当我想知道怀特的年龄时,我必须使用循环:
for(var i=0; i<user.length; i++){
……
}
我认为这不是一个好方法。 是否有任何类似于数组的对象可以满足需求。以下是我的工作:
function arrayObj(){
var arr = [], obj = {};
this.pop = function(){
var o = arr.pop();
if(o){
for(var k in o){ delete obj[k]; }
this.length--;
}
};
this.unshift = function(o){
arr.unshift(o);
for(var k in o){ obj[k] = o[k]; }
this.length++;
};
this.length = 0;
this.get = function(n){
if(obj[n]!=null && obj[n]!=undefined){
return obj[n];
} else {
return null;
}
};
}
var user = new arrayObj();
答案 0 :(得分:2)
基本上你想要的是哈希表对象的恒定查找速度,但是要具有数组的简单有序结构。合理的。
我想到的解决方案是使用JavaScript对象(基本上是哈希表)来跟踪人物对象存储在数组中的索引。它不简洁,但有点冗长,以提高可读性。它也没有任何错误检查,但这应该很容易添加。 http://jsfiddle.net/7es2xwqx/
function HashArray(){
this.indexKeys = {};
this.storage = [];
}
HashArray.prototype.addUser = function(name, age){
//if length is 10, storage.shift(), and delete
// delete user from indexKeys
if (this.storage.length === 10) {
this.storage.shift();
delete this.indexKeys[name];
}
// add user object {name, age} to storage
// add index of object on storage to indexKeys
// as {name: indexOnStorage}
this.indexKeys[name] = this.storage.length;
this.storage.push({name:name, age:age});
};
HashArray.prototype.getPerson = function(name){
var indexPersonObjLocated = this.indexKeys[name];
return this.storage[indexPersonObjLocated];
};
HashArray.prototype.getStorage = function(){
return this.storage;
};
HashArray.prototype.getKeys = function(){
return this.indexKeys;
};
var coolObj = new HashArray();
coolObj.addUser("White", 24);
coolObj.addUser("Whate", 25);
coolObj.addUser("Plite", 26);
console.log(coolObj.getUser("White"));
console.log(coolObj.getUser("Whate"));
console.log(coolObj.getUser("Plite"));
答案 1 :(得分:1)
function obj()
{
this.__model = [];
}
obj.prototype.add = function(key, value)
{
this[key] = value;
this.__model.push({ key: key, value: value });
if(this.__model.length > 10)
delete this[this.__model.shift().key];
console.log(this);
}
答案 2 :(得分:0)
也许你可以使用Object.keys
功能?
var users = {
"Jack": 24,
"White": 25
};
var user_history = [
"Jack",
"White"
];
function add_user(name, data) {
var keys = Object.keys(users);
var first_user;
if (keys.length > 10) {
first_user = user_history.shift();
delete users[first_user];
}
users[name] = data;
user_history.push(name);
}
add_user("Steven");
有关Object.keys的更多信息,请访问:https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/keys
答案 3 :(得分:0)
首先,如果您知道您的限制是10,那么只需使用循环。
第一和第六:构造函数应以大写字母开头;-)您为将要读取它的人编写代码,而不是为机器编写代码(机器可以使用0和1)。
其次,对于这些用例(当 n 可以更高时),要获得不错的性能,您需要同时使用两个结构:queue(例如,作为数组实现)才能够添加/删除项目;和键值存储(JS中的对象,即将到来的ES6中的Map)。要通过密钥访问,然后使用kvs,添加/删除您在同时更新kvs时使用队列。
如果您对快速队列实施感兴趣,可以查看&#34;循环队列&#34;或者使用一些lib(例如https://github.com/herby/queue)。