我想在内存中存储一个对象(让我们称之为 payload ),如下所示:
{
id: 123,
foo: { bar: "some data" }
}
第一个想法只是做:
let objectCollection = [];
objectCollection.push(payload);
这很有效。但是,应用程序的某些部分将操纵该数组,添加或删除它中的对象,这是我如何做的一个例子:
class objectCollection {
constructor() {
this.data = [];
}
add(payload) {
this.data.push(payload);
}
removeById(id) {
for(let i = 0; i < this.data.length; i++) {
if(this.data[i].id === id) {
this.data.splice(i, 0);
return null;
}
}
}
findOne(id) {
let data = this.data.filter((el) => {
return el.id === id
});
return data[0] || null;
}
}
正如你所看到的,这个集合类可以是一个其他类可以扩展的抽象类,它是一个非常基本的伪内存数据库......就像我不喜欢的一些东西:
在多线程上可能会出现竞争条件,一个进程找到了元素X的索引,在进行拼接功能之前,其他一些进程添加了一个新的元素移动所有元素索引,因此结果是进程1删除/拼接了错误的元素。
要查找或删除我需要迭代数组的元素。
我不期望数组中有超过5k个元素,因此迭代不应该是一个问题,我真的不想在需要另一个二进制文件监视的内存数据库中使用Redis或类似的应用程序复杂化。如果不是使用数组来存储我使用Object的元素,如下所示:
...
constructor() {
this.data = {};
}
add(payload) {
this.data[payload.id] = payload.foo;
}
remove(id) {
if(typeof this.data[id] !== 'undefined')
delete this.data[id];
}
这将清理一些代码并删除迭代。您如何看待这种方法?对于我从数组迁移到对象的决定有什么重要的影响吗?你能建议改进或已经这样做的库吗?