工作中经常会遇到这样的需求:
1.购物车列表中勾选某些,点击任意一项,前往详情页,再返回购物车依旧需要呈现勾选状态
2.勾选人员后,前往别的页面,再次返回,人员依旧程勾选状态
3.等等....

数据结构如下:
// 缓存数据
var students = [
{ id: 35, name: '小明', age: 25, address: '环球中心',checked:true},
{ id: 36, name: '杰伦', age: 41, address: '中国台湾' ,checked:true},
{ id: 37, name: '不撸死', age: 46, address: '霉国' ,checked:true}
] // 最新数据
var data = [
{ id: 35, name: '小明', age: 25, address: '环球中心',checked:false },
{ id: 36, name: '杰伦', age: 41, address: '中国台湾' ,checked:false},
{ id: 37, name: '不撸死', age: 46, address: '霉国' ,checked:false},
{ id: 38, name: '大明', age: 46, address: '哈哈哈哈哈' ,checked:false},
{ id: 39, name: '中明', age: 46, address: '中国四川' ,checked:false}
]
思路如下:

离开页面的时候将勾选的数据缓存,再次返回到页面时,将最新添加的数据和缓存的数据做对比,如果缓存中存在勾选,则更改对应的最新数据。

在做数据比对的时候,可以通过嵌套for循环,一层for循环遍历最新数据,二层for循环遍历缓存数据,如果缓存数据中对应的checked为true,则更改第一层for循环对应的值。虽然通过嵌套循环可以实现效果,但是循环的次数是两个数组长度的乘积,当数据量大的时候,这样会很耗性能。这里推荐另一种办法,将缓存的数组转换成Json对象,将唯一的id作为数组中每一项的key,将数组的每一项做为value,这样循环的时候只需要一层循环即可

具体代码如下:
// 缓存数据
var students = [
{ id: 35, name: '小明', age: 25, address: '环球中心',checked:true },
{ id: 36, name: '杰伦', age: 41, address: '中国台湾' ,checked:true},
{ id: 37, name: '不撸死', age: 46, address: '霉国' ,checked:true}
] // 最新数据
var data = [
{ id: 35, name: '小明', age: 25, address: '环球中心',checked:false },
{ id: 36, name: '杰伦', age: 41, address: '中国台湾' ,checked:false},
{ id: 37, name: '不撸死', age: 46, address: '霉国' ,checked:false},
{ id: 38, name: '大名', age: 46, address: '哈哈哈哈哈' ,checked:false},
{ id: 39, name: '中明', age: 46, address: '中国四川' ,checked:false}
] // 将数组转换为json对象
function Array2Json(arr, obj = {}) {
arr.forEach(item => {
obj[item.id] = item;
}) return obj
} students = Array2Json(students); // 此处可以用for循环,但是推荐使用while,因为while比for效率高 let i = 0;
while (i < data.length) {
if (students[data[i].id]) {
data[i].checked = true
}
i++;
}
// 最终得到的data就是还原了勾选状态的数据,可以直接渲染在界面上
console.log(data)

转载地址:https://segmentfault.com/a/1190000016281753

高效遍历匹配Json数据,避免嵌套循环[转]的更多相关文章

  1. 高效遍历匹配Json数据与双层for循环遍历Json数据

    工作中往往遇到这种情况,保留用户操作痕迹,比如用户选择过得东西,用户进入其它页面再返回来用户选择的的数据还在. 比如:1.购物车列表中勾选某些,点击任意一项,前往详情页,再返回购物车依旧需要呈现勾选状 ...

  2. jQuery遍历多层json数据

    1.json与jsonp的区别(待查) 2.要遍历的数据如下: {"status": "ok", "code": 200, "da ...

  3. 91.用js遍历原生json数据

    <!doctype html> <html lang="en"> <head>     <meta charset="UTF-8 ...

  4. MVC使用ajax异步刷新时怎样输出从后台中传过来的JSON数据

    前言 这几天在学习MVC使用AJAX异步刷,因为是新手.所以在js中传参数到后台以及后台返回数据到前台怎么接受,怎么前台遍历出JSON数据都开始不知道,相信新手在使用时跟我一样会遇到,这里我就和大家分 ...

  5. 一种从JSON数据创建Java类的高效办法

    <一种从JSON数据创建Java类的高效办法> 作者:chszs,转载需注明.博客主页:http://blog.csdn.net/chszs JSON格式的数据经常会遇到,比如调用Web服 ...

  6. C# JToken类的使用,实现解析动态json数据、遍历、查找

    在原来解析json数据是,一般都是用反序列化来实现json数据的解读,这需要首先知道json数据的结构并且建立相应的类才能反序列化,一旦遇到动态的json数据,这种方法就不使用. 为了解决动态解析js ...

  7. js声明json数据,打印json数据,遍历json数据

    1.js声明json数据: 2.打印json数据: 3.遍历json数据 //声明JSON var json = {}; json.a = 1; //第一种赋值方式(仿对象型) json['b'] = ...

  8. js遍历json数据

    先看看json返回的数据结构: 我需要遍历取出bookreno   与  title  加载到页面容器中去 首先我要取到 recommendedBookList  字典结构数据,然后遍历反射到相应对象 ...

  9. for-in遍历json数据

    1.for遍历json数据 ','fun':'前端开发'} for(var attr in json){ alert(json[attr]) //遍历json属性的数据 alert(json['nam ...

随机推荐

  1. Mesos源码分析(9): Test Framework的启动

    我们以Test Framework为例子解释Framework的启动方式. Test Framework的代码在src/examples/test_framework.cpp中的main函数 首先要指 ...

  2. Hadoop 集群安装(主节点安装)

    1.下载安装包及测试文档 切换目录到/tmp view plain copy cd /tmp 下载Hadoop安装包 view plain copy wget http://192.168.1.100 ...

  3. [Swift]LeetCode373. 查找和最小的K对数字 | Find K Pairs with Smallest Sums

    You are given two integer arrays nums1 and nums2 sorted in ascending order and an integer k. Define ...

  4. [Swift]LeetCode565. 数组嵌套 | Array Nesting

    A zero-indexed array A of length N contains all integers from 0 to N-1. Find and return the longest ...

  5. [Swift]LeetCode862. 和至少为 K 的最短子数组 | Shortest Subarray with Sum at Least K

    Return the length of the shortest, non-empty, contiguous subarray of A with sum at least K. If there ...

  6. [Swift]LeetCode965. 单值二叉树 | Univalued Binary Tree

    A binary tree is univalued if every node in the tree has the same value. Return true if and only if ...

  7. DMA的基本概念

    DMA允许外围设备和主内存之间直接传输 I/O 数据, DMA 依赖于系统.每一种体系结构DMA传输不同,编程接口也不同. 数据传输可以以两种方式触发:一种软件请求数据,另一种由硬件异步传输. 在第一 ...

  8. Unable to preventDefault inside passive event listener due to target being treated as passive

    Unable to preventDefault inside passive event listener due to target being treated as passive 今天在做项目 ...

  9. angularJS学习(二)

    1.实现列表 思路: accessCtrl.js let AccessCtrl = function($scope, AlertService, DialogService, BigDataServi ...

  10. Xamarin.Android多窗口传值【1】

    这种非常常见的场景我觉得大家都遇到过,那么我么可以通过Activity进行编码传值. using System.Text; using System; using Android.App; using ...