localStorage中一个数组嵌套一个数组的怪相

需求:向本地存储中循环添加对象

思路 :

​ 先完成点击事件中添加本地存储功能,当刷新时使用一个数组记录已经存储下来的数据,并在点击事件中将新生成的数组push进去,实现数据的添加。

第一版代码

 let btn = document.querySelector("button");
function Obj() {
this.a=1;
this.address='none';
this.mail='none' } let i = 0;
let arr = [];
let gettext = JSON.parse(localStorage.getItem("text")); // 注意
gettext ? arr.push(gettext) : arr = []; console.log(arr);
btn.onclick = function(){
let obj = new Obj();
obj.a = i;
arr.push(obj);
console.log(arr);
localStorage.setItem("text",JSON.stringify(arr));
i++;
}

按照之前思路列出了代码,在浏览器中查看存储下来的数据时却发现如下现象

数组发生嵌套,arr[0]和1中都嵌套了多层代码

分析后发现在上图中写着分析的那一行出现了问题,代码中将提取出的数据存放在gettext中,所以使用JSON.parse()时,其gettext实质上已经是一个数组对象了,而在将其push到arr中相当于将一个数组对象存放进了arr[0]中,故而出现了上述现象

于是对代码进行改进得到如下代码

let btn = document.querySelector("button");
function Obj() {
this.a=1;
this.address='none';
this.mail='none' } let i = 0;
let arr = [];
let gettext = JSON.parse(localStorage.getItem("text")); // 注意是arr与gettext之间等于号不是push,将i赋值得意实现属性a的累加
gettext ? (arr=gettext ,i=arr[arr.length-1].a+1): arr = []; btn.onclick = function(){
let obj = new Obj();
obj.a = i;
arr.push(obj);
console.log(arr);
localStorage.setItem("text",JSON.stringify(arr));
i++;
}

既然gettext已经是数组,则只需要之间将值赋予arr即可,再计算已存取的数据中最后一个数据的a属性的值再加1即可保证a属性的累加效果。

总结:在使用localStorage存取数据的时候

1、需要注意若需要在页面载入时获取并载入数据需要使用一个三元表达式

​ gettext ? (arr=gettext ,i=arr[arr.length-1].a+1): arr = [];

​ 避免第一次加载页面时浏览器中没有数据而将值为null的gettext存入数组中

2、注意在页面刷新并想要获取数据的时候以得到的是一个数组,可用等于号将其赋值给数组对象。切忌使用push

3、存储数据时记得使用JSON.stringify将数据类型转化为JSON对象,

​ 提取数据时记得使用JSON.parse()将JSON对象转化为我们需要的数据类型

localStorage中一个数组嵌套一个数组的怪相的更多相关文章

  1. js sort方法根据数组中对象的某一个属性值进行排序(实用方法)

    js sort方法根据数组中对象的某一个属性值进行排序 sort方法接收一个函数作为参数,这里嵌套一层函数用来接收对象属性名,其他部分代码与正常使用sort方法相同. var arr = [ {nam ...

  2. C++中vecotr表示二维数组并自己实现一个Grid类

    1 C++中使用vector来表示二维数组 声明一个二维数组: vector<vector<int>> dp(row, vector<int>(col)); 将变量 ...

  3. 百度:在O(1)空间复杂度范围内对一个数组中前后连段有序数组进行归并排序

    一.题目理解 题目:数组al[0,mid-1]和al[mid,num-1]是各自有序的,对数组al[0,num-1]的两个子有序段进行merge,得到al[0,num-1]整体有序.要求空间复杂度为O ...

  4. 用JS编写一个函数,返回数组中重复出现过的元素

    用JS编写一个函数,返回数组中重复出现过的元素,见下面的代码: , , , , , , , ]; var getRepeat = function (arr) { var obj = {}; , le ...

  5. 给定一个只包含正整数的非空数组,返回该数组中重复次数最多的前N个数字 ,返回的结果按重复次数从多到少降序排列(N不存在取值非法的情况)

    """ #给定一个只包含正整数的非空数组,返回该数组中重复次数最多的前N个数字 #返回的结果按重复次数从多到少降序排列(N不存在取值非法的情况) 解题思路: 1.设定一个 ...

  6. 42.输入一个递增排序的数组和一个数字S,在数组中查找两个数,使得他们的和正好是S, 如果有多对数字的和等于S,输出两个数的乘积最小的。

    输入一个递增排序的数组和一个数字S,在数组中查找两个数,使得他们的和正好是S, 如果有多对数字的和等于S,输出两个数的乘积最小的. 这道题有很多烟雾弹: 首先如果有多对,最前面的两个数就是乘积最小的, ...

  7. 《剑指Offer》第1题(Java实现):在一个二维数组中(每个一维数组的长度相同),每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数。

    一.题目描述 在一个二维数组中(每个一维数组的长度相同),每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序.请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该 ...

  8. js判断一个元素是否在数组中

    js判断一个元素是否在数组中 var arr = ['a','s','d','f']; console.info(isInArray(arr,'a'));//循环的方式 function isInAr ...

  9. 【JS】【6】判断一个元素是否在数组中

    摘要: 有三种方式: 1,jquery的inArray方法 2,数组的indexOf方法 3,普通的for循环方法 正文: 1,jquery的inArray方法 /** * @param {Objec ...

随机推荐

  1. scroll-view组件bindscroll实例应用:自定义滚动条

    我们知道scroll-view组件作为滑动控件非常好用,而有时候我们想放置一个跟随滚动位置来跟进的滚动条,但又不想用滚动条api该怎么办呢?(当然是自己写一个呗还能怎么办[自黑冷漠脸])嗯,没错.自己 ...

  2. Ubuntu16.04下安装python3.6.4详细步骤

    记录一下: Ubuntu16.04自带的python版本为python2.7和python3.5,现在想要安装python3.6.4,注意:系统自带的python版本别删除 步骤: # 官网下载安装包 ...

  3. 03 HDFS的客户端操作

    服务器和客户端的概念 hdfs的客户端有多种形式 1.网页形式 2.命令行形式 3.客户端在哪里运行,没有约束,只要运行客户端的机器能够跟hdfs集群联网 参数配置 文件的切块大小和存储的副本数量,都 ...

  4. django 登录、注册

    一.登录 1.在blogapp同级目录下新建一个userapp python manage.py startapp users 目录结构如下: 2.在主项目urls.py中新建users的includ ...

  5. nes 红白机模拟器 第7篇 编译使用方法

    模拟器,基于 InfoNES ,作者添加修改以下功能: 1, joypad 真实手柄驱动程序(字符型设备驱动) 2,原始图像只有256*240 ,添加 图像放大算法,这里实现了2种,a, 最近邻插值 ...

  6. ElasticSearch 6.2.4 实践

    参考资料 ElasticSearch 官网 ElasticSearch,Kibana,Asp.net Core with docker 示例 阮一峰 ElasticSearch 基础概念 索引(ind ...

  7. 数据结构 - Collection接口

    简介 Collection继承自Iterable,Collection接口是Java集合两大分支中的一支,Queue.List.Set都是Collection的扩展:集合大类分为了Collection ...

  8. git回滚到任意一个版本

    1.首先查找提交的记录(-3表示显示最近的3条) git log -3 2.强制回滚到制定版本 git reset --hard 制定版本commitId 如:git reset --hard 4ba ...

  9. 测试必知必会系列- Linux常用命令 - cp

    21篇测试必备的Linux常用命令,每天敲一篇,每次敲三遍,每月一循环,全都可记住!! https://www.cnblogs.com/poloyy/category/1672457.html 复制文 ...

  10. P5596 【XR-4】题 笔记

    P5596 [XR-4]题 其实这题我昨天没做出来--所以今天写一下笔记 昨天我还信誓旦旦地说这一定是一道黑题\(OTZ\).果然菜是原罪. 另外吐槽一下科技楼机房频繁停电,昨天写了两小时的树刨和倍增 ...