Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/457.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 如何在javascrript中创建类似数组的对象_Javascript_Arrays_Object - Fatal编程技术网

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"));