如何在javascript中创建类似对象的数组

时间:2015-04-10 08:37:19

标签: javascript arrays object

这就是我需要的:

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

4 个答案:

答案 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);
}

http://plnkr.co/edit/dxbiXj5y3e3uiu0Hch7q?p=preview

答案 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)。