Javascript 对象作为一种迷你数据库?

Ben*_*rke 4 javascript database arrays object

是否可以使用 JavaScript 对象作为一种迷你数据库?当我用 JS 编码时,我经常发现自己需要一种数据库结构,但使用像 MySQL(或类似的)这样的实际数据库感觉有点矫枉过正。

\n\n

举个例子,假设我需要将此数据构造为 JS 对象:

\n\n

对象想法:要出售的东西
\n要出售的物品:车库里的垃圾
\n对象结构:列出所有物品,包括物品名称、物品状况和物品价值

\n\n

为了将其变成 JS 对象,我可能会这样写:

\n\n
var stuffToSell = {};\n
Run Code Online (Sandbox Code Playgroud)\n\n

那么我的第一个项目可能看起来像:

\n\n
var stuffToSell = {\n    item : "Coffee Maker",\n    condition : "Good",\n    price : 5\n};\n
Run Code Online (Sandbox Code Playgroud)\n\n

现在对我来说,这似乎是我走在正确的轨道上,直到我添加另一个项目,我最终不得不使用属性itemconditionprice在同一个 JS 对象 \xe2\x80\x94 中再次\xe2\x80\x94 还是??此时我的大脑一直喊着“ARRAY!”这个词。对我来说,但我只是不明白如何使用对象内部的数组或数组内部的对象来实现我想要的。

\n\n

我的最终目标(在这个简化的示例中)是能够使用面向对象的语法来访问某些项目并找出有关该项目的特定信息pricecondition例如等。例如,如果我想知道我"coffee maker"想写这样的东西:

\n\n
stuffToSell["coffee maker"].price\n
Run Code Online (Sandbox Code Playgroud)\n\n

...然后上面的结果应该是5

\n\n

我觉得我走在正确的轨道上,但我想我错过了数组部分?有人可以告诉我我错过了什么或者我做错了什么!另外,同一个 JS 对象中的属性名称重复是否是错误的?例如,是否可以:

\n\n
var stuffToSell = {\nitem : "Coffee Maker",\nprice : 5,\nitem : "Mountain Bike",\nprice : 10,\nitem : "26 inch TV",\nprice : 15\n};\n
Run Code Online (Sandbox Code Playgroud)\n\n

...这似乎是错误的,因为那么 JS 如何知道哪个price与哪个相匹配item

\n\n

提前致谢 :)

\n

Jas*_*rey 5

您绝对走在正确的道路上!

很多人会把你所说的称为hash.

这是我为您建议的结构:

var store = {
        coffee_maker: {
                id: 'coffee_maker',
                description: "The last coffee maker you'll ever need!",
                price: 5,
        },
        mountain_bike: {
                id: 'mountain_bike',
                description: 'The fastest mountain bike around!',
                price: 10,
        },
        tv: {
                id: 'tv',
                description: 'A big 26 inch TV',
                price: 15,
        },
}
Run Code Online (Sandbox Code Playgroud)

拥有这样的结构可以让你做到这一点:

store.mountain_bike.price // gives me 10
Run Code Online (Sandbox Code Playgroud)

需要一个数组,比如用于过滤或循环?

Object.keys为您提供存储中所有对象键的数组['coffee_maker', 'mountain_bike', 'tv']

// Now we just have an array of objects 
// [{id: 'coffee_maker', price: 5}, {id: 'mountain_bike', price: 10} ...etc]
var arr = Object.keys(store).map(el => store[el])
Run Code Online (Sandbox Code Playgroud)

需要仅过滤少于 10 的项目吗?

这将为我们提供少于 10 个的乘积数组:

// gives us [{id: 'coffee_maker', price: 5}]
var productsUnder10 = arr.filter(el => el.price < 10)
Run Code Online (Sandbox Code Playgroud)

这些技术可以串联起来:

var productsOver10 = Object.keys(store)
    .map(el => store[el])
    .filter(el => el.price > 10)
Run Code Online (Sandbox Code Playgroud)

需要添加产品吗?

store['new_product'] = {
    id: 'new_product',
    description: 'The Newest Product',
    price: 9000,
}
Run Code Online (Sandbox Code Playgroud)

这是另一种方法,最好开始习惯。这是更新存储的“安全”方式,请阅读 javascript 中的不变性来了解它

store = Object.assign({}, store, {
    'new_product': {
        id: 'new_product',
        description: 'The Newest Product',
        price: 9000,
    }
})
Run Code Online (Sandbox Code Playgroud)

...还有另一种方式,您还应该阅读并开始使用:这是对象扩展运算符,基本上只是一种使用不可变结构的更简单的方法

store = {
    ...store,
    'new_product': {
        id: 'new_product',
        description: 'The Newest Product',
        price: 9000,
    }
}
Run Code Online (Sandbox Code Playgroud)

资源

  • 你是个天才。您详细回答了我问题的每一部分,并且还为我提供了很多关于如何使用 JS 对象存储和访问信息的有用信息。我相信这也会帮助许多与我处境相同的人。我只能梦想拥有像你一样渊博的 JavaScript 知识!谢谢。 (2认同)