javascript - 存储此数据的最佳方式(数组、对象等)

标签 javascript jquery arrays object

我需要存储(许多)对象或数据数组,需要满足以下条件:

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

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

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

我试过使用这样的结构:

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

这给了我想要在给出引用的情况下轻松获取信息的需求:

info = saved_info[1001];

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

最佳答案

您可以使用两个对象:

  • 按键存储数据
  • 另一个存储排序顺序

这样您就可以 (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());

关于javascript - 存储此数据的最佳方式(数组、对象等),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22932358/

相关文章:

javascript - 如何从多个图像访问多个 alt 属性值?

javascript - 单击 a href 时 Jquery Ajax 调用将数据发送到方法

php - 是否可以使用 PHP 或 JavaScript 从用户处获取剪贴板数据?

javascript - 转到 Typescript Source Definition 而不是 Visual Studio Code 中的 Compiled Definition

javascript - 使用 HTML5 在拖放中切换内容

javascript - Bootstrap 的 javascript 在本地工作,但在部署到服务器时不工作

c - 对于数组,为什么 a[5] == 5[a]?

javascript - 如何将 'apply' 转换为 'call' 或其他

jquery - 负边距 div 正在造成溢出

arrays - 除非显式引用一个字典枚举键,否则编译器会报错