【问题标题】:Best way to store this data (array, object, etc)存储此数据的最佳方式(数组、对象等)
【发布时间】:2014-04-08 09:03:51
【问题描述】:

我需要存储(许多)对象或数据数组,它们需要具备以下条件:

我需要能够轻松地将一组新数据添加到现有数据中

我需要能够轻松地按添加的日期/时间对数据进行排序(数组按条目推送的时间排列)

我需要能够使用引用(整数或字符串)轻松获取条目。这很重要,目前我必须执行 $.each() 来遍历我的数据,直到找到我想要的条目。

我尝试过使用如下结构:

saved_info = {
    1001: {//all my data for ref 1001},
    1002: {//all my data for ref 1002}
}

这给了我想要能够轻松获取信息的希望:

info = saved_info[1001];

但是,我使用的参考编号不按顺序排列 - 我使用给我的参考编号(它是唯一标识符),因此该对象不是按添加/保存/推送项目的时间顺序排列的。

【问题讨论】:

  • 我很确定这会导致语法错误。

标签: javascript jquery arrays object


【解决方案1】:

你可以使用两个对象:

  • 一种按键存储数据的工具
  • 另一个存储排序顺序的

通过这种方式,您可以 (i) 按键查找元素 (ii) 按插入顺序循环遍历元素。结构的大致轮廓:

var DataObject = {
    data: {},
    sort: []
};

以下是向此结构添加数据的方法:

DataObject.data[1004] = {name: "Test 4"};
DataObject.sort.push(1004);

DataObject.data[1001] = {name: "Test 1"};
DataObject.sort.push(1001);

DataObject.data[1003] = {name: "Test 3"};
DataObject.sort.push(1003);

DataObject.data[1002] = {name: "Test 2"};
DataObject.sort.push(1002);

这是执行随机访问的方法:

console.log(DataObject.data[1001].name);
console.log(DataObject.data[1003].name);

以下是您如何按照添加顺序遍历所有元素:

var i;
for (i = 0; i < DataObject.sort.length; i++) {
    console.log(DataObject.data[DataObject.sort[i]].name);
}

可以将整个逻辑包装在一个类中:

function DataObject() {
    this.data = {};
    this.sort = [];
    this.setItem = function (k, v) {
        this.data[k] = v;
        this.sort.push(k);
   };
    this.getItemByKey = function (k) {
        return this.data[k];
   };
    this.getItemByPos = function (i) {
        return this.data[this.sort[i]];
   };
    this.getAllItems = function () {
        var i, r = [];
        for (i = 0; i < this.sort.length; i++) {
            r.push(this.data[this.sort[i]]);
       }
        return r;
   };
}

var t = new DataObject();

t.setItem(1001, {name: "Test 1"});
t.setItem(1002, {name: "Test 2"});
t.setItem(1003, {name: "Test 3"});
t.setItem(1004, {name: "Test 4"});

console.log(t.getItemByKey(1001));
console.log(t.getItemByPos(0));
console.log(t.getAllItems());

【讨论】:

  • 谢谢你,这太棒了——不过我还有另一个问题。一旦我将所有信息都保存在变量中,我想将其存储在 localStorage 中。目前,当我从保存的存储中检索信息并运行例如 .getAllItems 时,我得到'Object [object Object] 没有方法'getAllItems'。有没有办法解决这个问题?
  • 参见:stackoverflow.com/q/2010892/87015 好像不能直接将对象存储在 localStorage 中。您可以将实用方法添加到类中,例如 saveToLocalStoragerestoreFromLocalStoragedatasort 存储/检索为 JSON 编码字符串。
【解决方案2】:

尝试像这样构建一个Json,

var xJson = {
    "1001":{//all my data for ref 1001},
    "1002":{//all my data for ref 1002}
};

您可以根据自己的意愿使用括号表示法获取记录,因为我们使用数值作为键。

var xData = xJson["1001"];

【讨论】:

  • 我想尝试过但没有成功,你能举个简单的例子来说明如何构建 JSON 吗?
  • 这不是已经在问题中尝试过的同一件事吗?我认为问题出在订购方面。
  • @Aioros Op 有一个无效的 json 你看到了吗..?
  • 是的,但我认为这是数据结构的通用示例。没关系。
猜你喜欢
  • 1970-01-01
  • 2016-09-08
  • 1970-01-01
  • 1970-01-01
  • 2018-12-01
  • 2013-09-10
  • 2014-07-28
  • 2012-05-10
  • 2011-11-26
相关资源
最近更新 更多