【问题标题】:Javascript object as a type of mini database?Javascript 对象作为一种小型数据库?
【发布时间】:2018-02-04 03:50:46
【问题描述】:

是否可以将 JavaScript 对象用作一种小型数据库?当我在 JS 中编码时,我经常发现自己需要一种数据库结构,但使用 MySQL(或类似)这样的实际数据库感觉有点过头了。

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

对象的想法:要出售的东西
要出售的物品:车库里的垃圾
对象结构:列出所有项目包括项目名称、项目条件和项目

为了把它变成一个 JS 对象,我可能会写:

var stuffToSell = {};

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

var stuffToSell = {
    item : "Coffee Maker",
    condition : "Good",
    price : 5
};

现在对我来说,这似乎是在正确的轨道上,直到我添加另一个项目,我最终不得不在同一个 JS 中再次使用属性 itemconditionprice对象-感觉不对? ——或者是吗?在这一点上,我的大脑一直在喊“ARRAY!”这个词。对我来说,但我只是看不到如何使用对象内的数组或数组内的对象来实现我想要的。

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

stuffToSell["coffee maker"].price

...那么上面的结果应该是5

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

var stuffToSell = {
item : "Coffee Maker",
price : 5,
item : "Mountain Bike",
price : 10,
item : "26 inch TV",
price : 15
};

...这似乎是错误的,因为 JS 怎么知道哪个price 与哪个item 搭配??

提前致谢:)

【问题讨论】:

    标签: javascript arrays database object


    【解决方案1】:

    你绝对是在正确的轨道上!

    很多人会将您所说的内容称为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,
            },
    }
    

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

    store.mountain_bike.price // gives me 10
    

    需要一个数组来代替,比如过滤或循环?

    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])
    

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

    这将为我们提供少于 10 个产品的数组:

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

    这些技术可以链接起来:

    var productsOver10 = Object.keys(store)
        .map(el => store[el])
        .filter(el => el.price > 10)
    

    需要添加产品吗?

    store['new_product'] = {
        id: 'new_product',
        description: 'The Newest Product',
        price: 9000,
    }
    

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

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

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

    store = {
        ...store,
        'new_product': {
            id: 'new_product',
            description: 'The Newest Product',
            price: 9000,
        }
    }
    

    资源

    【讨论】:

    • 你是个天才。你已经详细回答了我的问题的每个部分,还给了我很多有用的信息,告诉我如何使用 JS 对象来存储和访问信息。我相信这也将帮助许多与我在同一条船上的其他人。我只能梦想拥有和你一样广博的 JavaScript 知识!谢谢。
    • 感谢@BenClarke!我远离它,因为它不一定与这篇文章相关,但你开始关注的东西通常被称为“状态管理”。这是目前前端 JS 社区非常热门的话题。您将要开始研究的下一个级别是“单向数据流模式”、Redux、Vuex 和 MobX 等状态管理库。这是一个视频让您了解它:youtube.com/watch?v=nYkdrAPrdcw
    • 哇,谢谢,这是非常有用的信息。我想我可能听说过“状态管理”,因为我最近一直在涉足 Vue 和 React 的可怕且非常看似深海 - 但我可以肯定地说我没有'没有听说过'单向数据流模式',但我肯定会观看视频以了解更多信息,因为我确信这些信息只能帮助我了解更多关于 JavaScript 和一般编程的信息。再次感谢。
    • 酷。我是 Vue 的忠实粉丝,如果您需要任何帮助,请联系我。 React 社区最喜欢使用 Redux 库,Angular 使用 NgRx,Vue 使用 Vuex——所有这些都支持单向数据流。它们都是 Flux 的实现,主要基于 Elm 架构。顺便说一句,在所有的前端 JS 框架中,我强烈推荐 Vue 作为一个选择,如果它们对你来说都是新的。它涉及到绝大多数其他人正在做的事情(Angular、React 等),但它的概念和模式更容易上手和运行。
    • 这很有趣,因为当我研究 Vue、React 和 Angular 时,实际上 Vue 似乎是最直观和最容易掌握的,所以我肯定会继续沿着 Vue 的道路前进,希望能学到很多东西更多关于它。再次感谢您非常感谢的帮助和建议。
    【解决方案2】:

    您实际上可以使用json 或创建对象数组。如果使用单独的文件来存储对象,请先加载文件。使用数组过滤器方法获取一个与过滤条件匹配的新数组,就像您想要获取 id 为 1 的项目一样。这将返回一个对象数组。

    var dict = [{
        'id': 1,
        'name': 'coffee-mug',
        'price': 60
      },
      {
        'id': 2,
        'name': 'pen',
        'price': 2
      }
    ]
    
    function getItemPrice(itemId) {
      var getItem = dict.filter(function(item) {
        return item.id === itemId
      });
      return getItem[0].price;
    }
    
    console.log(getItemPrice(1))

    【讨论】:

    • 谢谢。所以你已经添加了我缺少的数组部分,现在我看到你是如何构建它的。但是,这是否意味着为了访问数组中的对象,我必须使用数组过滤器方法?只是我不太熟悉数组以及如何对它们进行排序/过滤,所以这可能是我必须学习的东西。我希望使用像stuffToSell["coffee maker"].price 这样的简单面向对象语法来访问数据。当我这样写时,它看起来很容易,但由于某种原因,我无法以允许我使用这种语法的方式组织代码。
    【解决方案3】:

    JSON 对象不支持重复键,因此您需要设置唯一键。

    将 id 作为分组项的关键:

    var stuffToSell = {
      '1': {
        item: "Coffee Maker",
        price: 5
      },
      '2': {
        item: "Mountain Bike",
        price: 10
      }
      .
      .
      .
    }
    

    现在您可以非常快速地了解商品的价格。

    看这段代码 sn -p (Known Ids)

    var stuffToSell = {
      '1': {
        item: "Coffee Maker",
        price: 5
      },
      '2': {
        item: "Mountain Bike",
        price: 10
      },
      '3': {
        item: "26 inch TV",
        price: 15
      }
    };
    
    let getPrice = (id) => stuffToSell[id].price;
    
    console.log(getPrice('1'));
    看?快速访问您的项目,并且您的代码遵循可读的结构。

    看这段代码 sn-p (Item's name as key)

    var stuffToSell = {
      'Coffee Maker': {
        price: 5
      },
      'Mountain Bike': {
        price: 10
      },
      '26 inch TV': {
        price: 15
      }
    };
    
    let getPrice = (id) => stuffToSell[id].price;
    
    console.log(getPrice('Coffee Maker'));

    看这段代码sn-p(商品名称:价格)

    var stuffToSell = {
      'Coffee Maker': 5,
      'Mountain Bike': 10,
      '26 inch TV': 15
    };
    
    let getPrice = (id) => stuffToSell[id];
    
    console.log(getPrice('Coffee Maker'));

    【讨论】:

    • 谢谢。所以你正在使用 nested 对象?这很棒,因为我认为这是我缺少的部分。而且我看到您已经为每个人分配了一个 ID,以便为每个人分配一个唯一的密钥以便于访问,这也是我没有做过的事情。但是,如果我不知道唯一的 id/key 并且只想使用商品名称来查找价格怎么办?用这种方法可以吗?
    • @是的,通过两种其他方法查看更新的答案。
    • 啊,我明白了——这是一个使用项目名称作为键的聪明方法,因为它允许我使用项目名称访问相关信息,如 pricecondition 等。它还可以防止因为我刚刚注意到,当我在对象中使用重复键时,我的代码编辑器会警告我输入重复项。我认为这种方法几乎可以满足我的要求,并且您也帮助我更好地理解了 JS 对象,所以谢谢。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-04-23
    • 2018-11-09
    • 1970-01-01
    • 1970-01-01
    • 2022-12-13
    • 1970-01-01
    相关资源
    最近更新 更多