Javascript 如何在javascrript中创建类似数组的对象
以下是我需要的:Javascript 如何在javascrript中创建类似数组的对象,javascript,arrays,object,Javascript,Arrays,Object,以下是我需要的: var user = { 'White' : 24, 'Jack' : 25, 'Jone' : 24, …… } 在这个obj中,我想存储一个人的姓名和年龄。而obj只能储存10人。如果添加了第11个人,则应删除第一个人。 所以我想到了一个数组,unshift和pop方法: var user = [ {'White': 24}, {'Jack' : 25}, {'Jone' : 24}, …… ] user
var user = {
'White' : 24,
'Jack' : 25,
'Jone' : 24,
……
}
在这个obj中,我想存储一个人的姓名和年龄。而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++){
……
}
也许您可以使用
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的详细信息,请单击此处:
首先,如果您知道您的限制是10,只需使用循环即可 第一和第二部分:构造函数应以大写字母开头;-)您为将阅读代码的人编写代码,而不是为机器编写代码(机器可以使用0和1) 其次,对于这些用例(当n可以更高时),为了获得良好的性能,您需要同时使用两种结构:队列(例如实现为数组),以便能够从中添加/删除项;和键值存储(JS中的对象,即将到来的ES6中的映射)。要通过密钥访问,则使用kvs;要添加/删除,则在更新kvs的同时使用队列
如果您对快速队列实现感兴趣,可以查找“循环队列”或使用一些库(例如)。基本上,您想要的是哈希表对象的恒定查找速度,但要具有数组的简单有序结构。很合理 我想到的解决方案是使用JavaScript对象(基本上是哈希表)跟踪person对象存储在数组中的索引。它不简洁,但有点冗长,以增加可读性。此外,它没有任何错误检查,但这应该很容易添加。
所以基本上你想让一个地图或集合用java语言表达?只是想弄清楚您想要什么。@怀特Javascript中没有有序的关联数据结构。如果你想要的话,你必须创建你自己的。我建议您创建一个对象,该对象保持现有的关联名称-值对,但另外还保存一个数组,其中按顺序存储键。在添加或删除项时,您必须同时更新对象和数组,但这样可以有效地执行这两项操作。@deceze确实我误读了数据结构。如果希望通过名称进行快速查找,为什么不使用用户名作为键的对象呢?这样,您就可以通过
users['White']
lookup获得与用户关联的所有属性。@doldt但这本身并不是有序的@谢谢你的建议,这就是我正在考虑的。我正在寻找一种更有效的数据结构,它不会使密钥保持有序。它将删除一个随机密钥,而不是最旧的密钥。不确定。IIRC,对象。键
保持插入顺序。根据ES5规范。@herby看起来确实如此,但我找不到任何可靠的信息。@herby你能链接到该规范吗?MDN说“与for…in循环提供的顺序相同”,这是“任意的”。@Steven它在实践中可能仅仅因为具体实现的实际情况而显得有序,但这是无法保证的,并且在任何情况下都可能中断。我想说,您可以取消值:value
,但除此之外,这是一个不错的解决方案。对队列使用this.\u model
,同时保留对this[key]
的读取权限,但强制使用。添加(key,value)
进行修改有点不一致和粗俗。我将在同一级别(方法)上完成整个API,并将键值存储和队列作为成员(这意味着不需要丑陋的\uuuu
)。当然,这也行得通。“构造函数应该以大写字母开头”感谢您的建议“Object.defineProperty”这个函数很酷。但是在queue.js中,如何添加没有循环的'get()'函数我不明白你的问题。也许你没有得到我的答案,我不倾向于用通俗易懂的文体写作。我在回答中告诉过你,你需要两种结构,一种是散列映射,另一种是队列。每个都有自己的目的。所以队列是开箱即用的。你不应该在上面加任何东西。另外,你应该有一个对象作为一个地图。这是用于键查找的。
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");
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);
}
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"));