【问题标题】:How to retrieve objects from sessionStorage?如何从 sessionStorage 中检索对象?
【发布时间】:2024-05-23 04:50:02
【问题描述】:

我正在生成菜肴列表(它们是对象),当用户单击按钮时,InitializeFoodList() 应将所选项目添加到 sessionStorage。然后在 RetrieveDataFromCart() 中,我想遍历 sessionStorage 并在控制台中显示所有这些项目。

问题是最终结果是 item 属性为 null 或者它只是显示最后添加的项目而下一个为 null。

有谁知道更好的方法来实现这一点?

var list = [{
    id: 1,
    name: "Spaghetti",
    price: 15,
    category: "main",
    pictureSrc: "images/food/spaghetti.jpg"
  },
  {
    id: 2,
    name: "Lasagne",
    price: 20,
    category: "main",
    pictureSrc: "images/food/Lasagne.jpg"
  },
  {
    id: 3,
    name: "Coca-cola",
    price: 5,
    category: "drinks",
    pictureSrc: "images/food/cola.jpg"
  },
  {
    id: 4,
    name: "Chicken",
    price: 12,
    category: "main",
    pictureSrc: "images/food/chicken.jpg"
  },
];

function InitializeFoodList() {

  var foodList = $('#foodList');

  for (let i = 0; i < list.length; i++) {
    const element = list[i];
    var buttonText = '<button class="btn btn-primary add" id="add' + i + '">+</button><button class="btn btn-primary" name="remove">-</button>';
    foodList.append("<li class='list-inline-item'><h4>" + element.name + "</h4><p>" + element.price + " zł</p><img alt=''height='200' width='200' class='img-thumbnail' src='" + element.pictureSrc + "'><br>" + buttonText + "</li>");
    $('#add' + i).click(function() {
      sessionStorage.setItem("cart", JSON.stringify(element));
    });
  }
}

function RetrieveDataFromCart() {

  var elements = [];

  for (let i = 0; i < sessionStorage.length; i++) {
    var element = JSON.parse(sessionStorage.getItem(localStorage.key(i)));
    elements.push(element);
    console.log(element.name);
  }

}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<div>
  <button onclick="InitializeFoodList()">Click me</button>
  <button onclick="RetrieveDataFromCart()">Retrieve</button>
  <ul id="foodList" class="list-inline"></ul>
</div>

【问题讨论】:

    标签: javascript jquery html session-storage


    【解决方案1】:

    我只想将整个数组保存在一个键下

    然后您可以在内存中添加/删除或修改数组中的对象,并在每次更改时存储修改后的数组

    function getStoredCart(){
        // return stored array and if not existing return an empty array
        return JSON.parse(sessionStorage.getItem('cart') || '[]')
    }
    
    function saveCart(array){
       sessionStorage.setItem("cart", JSON.stringify(array)); 
    }
    
    // example deleting item
    function deleteItem(item){
        var itemIndex = cartList.indexOf(item)
        cartArray.splice(itemIndex,1); // remove from stored array       
        saveCart(cartArray ); // save it back into storage
    }
    
    // example adding item
    function addItem(itemObject){       
        cartArray .push(itemObject); // push new object to array       
        saveCart(cartArray ); // save it back into storage
    }
    
    
    // keep array reference in variable whole time page is active
    var cartArray = getStoredCart();
    
    $.each(cartArray , function(i, item){
        // add the html for each item and use `item` reference in click handlers when doing modifications
    })
    

    【讨论】:

      【解决方案2】:

      您正确使用了 sessionStorage,但是这个 sn-p 存在一些问题。首先,在 sessionStorage 中设置项目时,您每次都将“cart”添加为键,因此它会导致覆盖之前存储为 sessionStorage 中的项目存储为键值对的值,并且键应该是唯一的,否则它会更新存储在同一把钥匙。

      所以我用键名 'cart' 即 'cart' + i 添加了 i 的值。您可以根据您的用例使用任何唯一键。 其次,不是使用 localStorage 获取特定密钥,而是使用会话存储(似乎是一些错字)

      更新了sn-p

      var list = [{
          id: 1,
          name: "Spaghetti",
          price: 15,
          category: "main",
          pictureSrc: "images/food/spaghetti.jpg"
      },
      {
          id: 2,
          name: "Lasagne",
          price: 20,
          category: "main",
          pictureSrc: "images/food/Lasagne.jpg"
      },
      {
          id: 3,
          name: "Coca-cola",
          price: 5,
          category: "drinks",
          pictureSrc: "images/food/cola.jpg"
      },
      {
          id: 4,
          name: "Chicken",
          price: 12,
          category: "main",
          pictureSrc: "images/food/chicken.jpg"
      },
      ];
      
      function InitializeFoodList() {
      
      var foodList = $('#foodList');
      
      for (let i = 0; i < list.length; i++) {
          const element = list[i];
          var buttonText = '<button class="btn btn-primary add" id="add' + i + '">+</button><button class="btn btn-primary" name="remove">-</button>';
          foodList.append("<li class='list-inline-item'><h4>" + element.name + "</h4><p>" + element.price + " zł</p><img alt=''height='200' width='200' class='img-thumbnail' src='" + element.pictureSrc + "'><br>" + buttonText + "</li>");
          $('#add' + i).click(function() {
          sessionStorage.setItem("cart" + i, JSON.stringify(element));
          });
      }
      }
      
      function RetrieveDataFromCart() {
      
      var elements = [];
      
      for (let i = 0; i < sessionStorage.length; i++) {
          var element = JSON.parse(sessionStorage.getItem(sessionStorage.key(i)));
          elements.push(element);
          console.log(element.name);
      }
      
      }
      

      【讨论】: