您的位置:首页 > 技术中心 > 前端框架 >

解决JavaScript数据处理的5个常见问题

时间:2022-06-06 11:12

本篇文章给大家带来了关于javascript的相关知识,其中主要介绍了关于数据处理中常见的一些问题,包括了数据的增删改查、数据的排序、数据的去重、平级列表变成树形结构以及数组对象相同项合并处理,下面一起来看一下,希望对大家有帮助。

【相关推荐:javascript视频教程、web前端】

随着前端技术的不断发展,前端工作需要展示的界面越来越复杂,因此数据处理的场景越来越多,例如:后台管理系统中常常需要展示一个树状结构,后台返回的前端的数据是平级结构,这时候需要我们把数据转成树结构; echart柱状图展示时,需要对返回数据进行去重合并处理;在进行筛选的时候,我们需要对数据进行一个排序处理;最常见的还有我们在做留言评论时候Dom的增删改查等等,那么今天这篇文章带你一起走进这些业务场景,直面这些疑难杂症,让我们面对JavaScript的数据操作不再恐惧,让开发工作变得简单高效起来。

一、数据的增删改查

场景:这是一个后台管理系统——字典管理模块,包含了数据字典的增删改查4个操作。那么应对这4个操作,我们的解决方案是什么呢,请您接着往下看

1、数组的新增

arr.push 从数组后面推入一个元素或多个元素

  1. var arr = [1,2,3];
  2. // 返回:修改后数组的长度
  3. arr.push(4,5,6);
  4. console.log(arr)
  5. //输出结果
  6. arr=[1,2,3,4,5,6]

arr.unshift 从数组前面添加一个或多个元素

  1. var arr = [1,2,3];
  2. // 返回:修改后数组的长度
  3. arr.unshift(4,5,6);
  4. console.log(arr)
  5. //输出结果
  6. arr=[4,5,6,1,2,3]

2、数组的删除

arr.shift 用于将数组的第一个元素移除

  1. // 数组的shift方法用于将数组的第一个元素移除
  2. var arr = [1,2,3];
  3. // 返回 被删除的元素;
  4. arr.shift();
  5. //输出结果
  6. arr=[2,3]

arr.pop 删除数组最后一个元素;

  1. // 数组的pop方法用于将数组的最后一个元素移除
  2. var arr = [1,2,3];
  3. // 返回 被删除的元素;
  4. arr.pop();
  5. //输出结果
  6. arr = [1,2];

3、数组的修改

arr.splice:可进行数组任何位置的增删改

具有删除、插入,替换三个作用,该方法返回的是一个数组(包含从原数组中删除的项(若没有删除项则返回一个空数组))

语法

splice(index,howmany,item1,…itemx);

  • index——必须,整数,规定添加或者删除的位置,使用负数,从数组尾部规定位置。
  • howmany——必须,要删除的数量,如果为0,则不删除项目。
  • item1,…itemx——可选,向数组添加的新项目。
  1. 1. 删除
  2. 可删除任意数量的项,只需指定2个参数:要删除的第一项的位置和要删除的项数。
  3. let arr=[1,2,3];
  4. let arr1=arr.splice(1,2);//会删除数组的第2和3个元素(即2,3)
  5. alert(arr);//[1]
  6. alert(arr1);//[2,3]
  7. 2. 插入
  8. 可以向指定位置插入任意数量的项只需提供3个参数:起始位置、0(要删除的项数)、要插入的项。
  9. let arr=[1,2,3];
  10. let arr1=arr.splice(1,0,4,5);//会从数组的1位置开始插入4,5
  11. alert(arr);//[1,4,5,2,3]
  12. alert(arr1);//[]
  13. 3. 替换
  14. 可以向指定位置插入任意数量的项,且同时删除任意数量的项,只需指定3个参数:起始位置、要删除的项数和要插入的任意数量的项(插入的数量不必与删除的数量相等)
  15. let arr = [1,2,3];
  16. let arr1=arr.splice(1,1,"red","green");//会删除2,然后从2位置插入字符串"red"和"green"
  17. alert(arr);//[1,"red","green",3]
  18. alert(arr1);//[2]

4、数组的查找

arr.indexOf:根据元素查找索引,如果这个元素在数组中,返回索引,否则返回-1,找元素在不在数组内部

  1. var arr = [10,20,30]
  2. console.log(arr.indexOf(30)); // 2
  3. console.log(arr.indexOf(40)); // -1

arr.findIndex :用于查找满足条件的第一个元素的索引,如果没有,则返回-1

  1. var arr = [10, 20, 30];
  2. var res1 = arr.findIndex(function (item) {
  3. return item >= 20;
  4. });
  5. // 返回 满足条件的第一个元素的的索引
  6. console.log(res1);

5、数组与字符串互转

join 用于将数组中的多元素以指定分隔符连接成一个字符串

  1. var arr = ['用户1','用户2','用户3'];
  2. var str = arr.join('|');
  3. console.log(str); //
  4. 用户1|用户2|用户3

split 字符串的方法:转数字,后面为分隔的字符

  1. // 这个方法用于将一个字符串以指定的符号分割成数组
  2. var str = '用户1|用户2|用户3';
  3. var arr = str.split('|');
  4. console.log(arr);
  5. ['用户1','用户2','用户3']

二、数据的排序

不得不说,随着科技的进步硬件的发展,浏览器的计算性能也随之提升,接下来我们会遇到第二种情况——数据的排序操作,也就是需要我们在前端实现各种排序,那么我们的解决方案又有哪些呢,接着往下看~

1、js的自带函数arr.sort()

  1. var arr = [23,34,3,4,23,44,333,444];
  2. arr.sort(function(a,b){
  3. return a-b;
  4. })
  5. console.log(arr);

这里也一并介绍一下常用的几种排序算法:

2、插入排序

  1. var arr = [23,34,3,4,23,44,333,444];
  2. var arrShow = (function insertionSort(array){
  3. if(Object.prototype.toString.call(array).slice(8,-1) ==='Array'){
  4. for (var i = 1; i < array.length; i++) {
  5. var key = array[i];
  6. var j = i - 1;
  7. while (j >= 0 && array[j] > key) {
  8. array[j + 1] = array[j];
  9. j--;
  10. }
  11. array[j + 1] = key;
  12. }
  13. return array;
  14. }else{
  15. return 'array is not an Array!';
  16. }
  17. })(arr);
  18. console.log(arrShow);//[3, 4, 23, 23, 34, 44, 333, 444]

3、二分插入排序

  1. function binaryInsertionSort(array) {
  2. if (Object.prototype.toString.call(array).slice(8, -1) === 'Array') {
  3. for (var i = 1; i < array.length; i++) {
  4. var key = array[i], left = 0, right = i - 1;
  5. while (left <= right) {
  6. var middle = parseInt((left + right) / 2);
  7. if (key < array[middle]) {
  8. right = middle - 1;
  9. } else {
  10. left = middle + 1;
  11. }
  12. }
  13. for (var j = i - 1; j >= left; j--) {
  14. array[j + 1] = array[j];
  15. }
  16. array[left] = key;
  17. }
  18. return array;
  19. } else {
  20. return 'array is not an Array!';
  21. }
  22. }

4、选择排序

  1. function selectionSort(array) {
  2. if (Object.prototype.toString.call(array).slice(8, -1) === 'Array') {
  3. var len = array.length, temp;
  4. for (var i = 0; i < len - 1; i++) {
  5. var min = array[i];
  6. for (var j = i + 1; j < len; j++) {
  7. if (array[j] < min) {
  8. temp = min;
  9. min = array[j];
  10. array[j] = temp;
  11. }
  12. }
  13. array[i] = min;
  14. }
  15. return array;
  16. } else {
  17. return 'array is not an Array!';
  18. }
  19. }

5、冒泡排序

  1. function bubbleSort(array) {
  2. if (Object.prototype.toString.call(array).slice(8, -1) === 'Array') {
  3. var len = array.length, temp;
  4. for (var i = 0; i < len - 1; i++) {
  5. for (var j = len - 1; j >= i; j--) {
  6. if (array[j] < array[j - 1]) {
  7. temp = array[j];
  8. array[j] = array[j - 1];
  9. array[j - 1] = temp;
  10. }
  11. }
  12. }
  13. return array;
  14. } else {
  15. return 'array is not an Array!';
  16. }
  17. }

6、快速排序

  1. //方法一
  2. function quickSort(array, left, right) {
  3. if (Object.prototype.toString.call(array).slice(8, -1) === 'Array' && typeof left === 'number' && typeof right === 'number') {
  4. if (left < right) {
  5. var x = array[right], i = left - 1, temp;
  6. for (var j = left; j <= right; j++) {
  7. if (array[j] <= x) {
  8. i++;
  9. temp = array[i];
  10. array[i] = array[j];
  11. array[j] = temp;
  12. }
  13. }
  14. quickSort(array, left, i - 1);
  15. quickSort(array, i + 1, right);
  16. };
  17. } else {
  18. return 'array is not an Array or left or right is not a number!';
  19. }
  20. }
  21. var aaa = [3, 5, 2, 9, 1];
  22. quickSort(aaa, 0, aaa.length - 1);
  23. console.log(aaa);
  24. //方法二
  25. var quickSort = function(arr) {
  26.   if (arr.length <= 1) { return arr; }
  27.   var pivotIndex = Math.floor(arr.length / 2);
  28.   var pivot = arr.splice(pivotIndex, 1)[0];
  29.   var left = [];
  30.   var right = [];
  31.   for (var i = 0; i < arr.length; i++){
  32.     if (arr[i] < pivot) {
  33.       left.push(arr[i]);
  34.     } else {
  35.       right.push(arr[i]);
  36.     }
  37.   }
  38.   return quickSort(left).concat([pivot], quickSort(right));
  39. };

7、堆排序

  1. /*方法说明:堆排序
  2. @param array 待排序数组*/
  3. function heapSort(array) {
  4. if (Object.prototype.toString.call(array).slice(8, -1) === 'Array') {
  5. //建堆
  6. var heapSize = array.length, temp;
  7. for (var i = Math.floor(heapSize / 2); i >= 0; i--) {
  8. heapify(array, i, heapSize);
  9. }
  10. //堆排序
  11. for (var j = heapSize - 1; j >= 1; j--) {
  12. temp = array[0];
  13. array[0] = array[j];
  14. array[j] = temp;
  15. heapify(array, 0, --heapSize);
  16. }
  17. } else {
  18. return 'array is not an Array!';
  19. }
  20. }
  21. /*方法说明:维护堆的性质
  22. @param arr 数组
  23. @param x 数组下标
  24. @param len 堆大小*/
  25. function heapify(arr, x, len) {
  26. if (Object.prototype.toString.call(arr).slice(8, -1) === 'Array' && typeof x === 'number') {
  27. var l = 2 * x, r = 2 * x + 1, largest = x, temp;
  28. if (l < len && arr[l] > arr[largest]) {
  29. largest = l;
  30. }
  31. if (r < len && arr[r] > arr[largest]) {
  32. largest = r;
  33. }
  34. if (largest != x) {
  35. temp = arr[x];
  36. arr[x] = arr[largest];
  37. arr[largest] = temp;
  38. heapify(arr, largest, len);
  39. }
  40. } else {
  41. return 'arr is not an Array or x is not a number!';
  42. }
  43. }

三、数据的去重

好的,当我们解决完排序的问题,紧接着我们又面临着数据去重的问题,不要怕,解决方案依然有很多,请您慢慢往下接着看:

在工作上,对json数据处理时,例如遇到对某些产品的尺码进行排序,不同的产品都有相同的尺码那是正常不过的事情,如果我们要把这些转成表格的形式来展现,那么这些尺码就不要不能重复才行.在这里呢,我就写几个数组去重的方法,给大家参考参考 :

1、简单的去重方法

  1. // 最简单数组去重法
  2. /*
  3. * 新建一新数组,遍历传入数组,值不在新数组就push进该新数组中
  4. * IE8以下不支持数组的indexOf方法
  5. * */
  6. function uniq(array){
  7. var temp = []; //一个新的临时数组
  8. for(var i = 0; i < array.length; i++){
  9. if(temp.indexOf(array[i]) == -1){
  10. temp.push(array[i]);
  11. }
  12. }
  13. return temp;
  14. }
  15. var aa = [1,2,2,4,9,6,7,5,2,3,5,6,5];
  16. console.log(uniq(aa));

2、对象键值法去重

  1. /*
  2. * 速度最快, 占空间最多(空间换时间)
  3. *
  4. * 该方法执行的速度比其他任何方法都快, 就是占用的内存大一些。
  5. * 现思路:新建一js对象以及新数组,遍历传入数组时,判断值是否为js对象的键,
  6. * 不是的话给对象新增该键并放入新数组。
  7. * 注意点:判断是否为js对象键时,会自动对传入的键执行“toString()”,
  8. * 不同的键可能会被误认为一样,例如n[val]-- n[1]、n["1"];
  9. * 解决上述问题还是得调用“indexOf”。*/
  10. function uniq(array){
  11. var temp = {}, r = [], len = array.length, val, type;
  12. for (var i = 0; i < len; i++) {
  13. val = array[i];
  14. type = typeof val;
  15. if (!temp[val]) {
  16. temp[val] = [type];
  17. r.push(val);
  18. } else if (temp[val].indexOf(type) < 0) {
  19. temp[val].push(type);
  20. r.push(val);
  21. }
  22. }
  23. return r;
  24. }
  25. var aa = [1,2,"2",4,9,"a","a",2,3,5,6,5];
  26. console.log(uniq(aa));

3、排序后相邻去除法

  1. /*
  2. * 给传入数组排序,排序后相同值相邻,
  3. * 然后遍历时,新数组只加入不与前一值重复的值。
  4. * 会打乱原来数组的顺序
  5. * */
  6. function uniq(array){
  7. array.sort();
  8. var temp=[array[0]];
  9. for(var i = 1; i < array.length; i++){
  10. if( array[i] !== temp[temp.length-1]){
  11. temp.push(array[i]);
  12. }
  13. }
  14. return temp;
  15. }
  16. var aa = [1,2,"2",4,9,"a","a",2,3,5,6,5];
  17. console.log(uniq(aa));

4、数组下标法

  1. /*
  2. *
  3. * 还是得调用“indexOf”性能跟方法1差不多,
  4. * 实现思路:如果当前数组的第i项在当前数组中第一次出现的位置不是i,
  5. * 那么表示第i项是重复的,忽略掉。否则存入结果数组。
  6. * */
  7. function uniq(array){
  8. var temp = [];
  9. for(var i = 0; i < array.length; i++) {
  10. //如果当前数组的第i项在当前数组中第一次出现的位置是i,才存入数组;否则代表是重复的
  11. if(array.indexOf(array[i]) == i){
  12. temp.push(array[i])
  13. }
  14. }
  15. return temp;
  16. }
  17. var aa = [1,2,"2",4,9,"a","a",2,3,5,6,5];
  18. console.log(uniq(aa));

5、优化遍历数组法

  1. // 思路:获取没重复的最右一值放入新数组
  2. /*
  3. * 推荐的方法
  4. *
  5. * 方法的实现代码相当酷炫,
  6. * 实现思路:获取没重复的最右一值放入新数组。
  7. * (检测到有重复值时终止当前循环同时进入顶层循环的下一轮判断)*/
  8. function uniq(array){
  9. var temp = [];
  10. var index = [];
  11. var l = array.length;
  12. for(var i = 0; i < l; i++) {
  13. for(var j = i + 1; j < l; j++){
  14. if (array[i] === array[j]){
  15. i++;
  16. j = i;
  17. }
  18. }
  19. temp.push(array[i]);
  20. index.push(i);
  21. }
  22. console.log(index);
  23. return temp;
  24. }
  25. var aa = [1,2,2,3,5,3,6,5];
  26. console.log(uniq(aa));

四 、平级列表变成树形结构

呐,在选择部门的时候,是不是会经常看到这种树状菜单,后台返回的数据一般都是平级的数组,那么这种菜单,我们一般是怎么生成的呢,请看~~

1、这里特意将方法奉上:

  1. const dataTree = [
  2. {id: 1, name: '总公司', parentId: 0},
  3. {id: 2, name: '深圳分公司', parentId: 1},
  4. {id: 3, name: '北京分公司', parentId: 1},
  5. {id: 4, name: '研发部门', parentId: 2},
  6. {id: 5, name: '市场部门', parentId: 2},
  7. {id: 6, name: '测试部门', parentId: 2},
  8. {id: 7, name: '财务部门', parentId: 2},
  9. {id: 8, name: '运维部门', parentId: 2},
  10. {id: 9, name: '市场部门', parentId: 3},
  11. {id: 10, name: '财务部门', parentId: 3},
  12. ]
  13. function changeData(data, parentId = 0) {
  14. let tree = [];//新建空数组
  15. //遍历每条数据
  16. data.map((item) => {
  17. //每条数据中的和parentId和传入的相同
  18. if (item.parentId == parentId) {
  19. //就去找这个元素的子集去 找到元素中parentId==item.id 这样层层递归
  20. item.children = changeData(data, item.id);
  21. tree.push(item);
  22. }
  23. })
  24. return tree
  25. }
  26. console.log(changeData(dataTree, 0));

五、数组对象相同项合并处理

我们在图表展示的时候会经常遇到数据处理,其中数组合并处理也会经常遇到,下面就是数组相同项合并的一种方式:

  • 首先由原始的数组arr数据,
  • 然后创建一个map空对象和一个result空数组,通过判断map中是否含有某项来判断数组result是否添加数据,
  • 然后再判断相同项和已有的result数组内容比较合并;

1、博主特意将珍藏多年的祖传代码,在这里奉献给各位大佬:

  1.   var arr = [
  2.     {"id":"1","name":"车厘子","num":"245"},
  3.     {"id":"1","name":"车厘子","num":"360"},
  4.     {"id":"2","name":"苹果","num":"120"},
  5.     {"id":"2","name":"苹果","num":"360"},
  6.     {"id":"2","name":"苹果","num":"180"},
  7.     {"id":"3","name":"香蕉","num":"160"},
  8.     {"id":"4","name":"菠萝","num":"180"},
  9.     {"id":"4","name":"菠萝","num":"240"}
  10.   ];
  11.   var map = {},result= [];
  12.   for(var i = 0; i < arr.length; i++){
  13.     var ele = arr[i];
  14.     if(!map[ele.id]){
  15.       result.push({
  16.         id: ele.id,
  17.         name: ele.name,
  18.         value: ele.value
  19.       });
  20.       map[ele.id] = ele;
  21.     }else{
  22.       for(var j = 0; j < result.length; j++){
  23.         var dj = result[j];
  24.         if(dj.id == ele.id){
  25.           dj.value=(parseFloat(dj.value) + parseFloat(ele.value)).toString();
  26.           break;
  27.         }
  28.       }
  29.     }
  30.   };
  31.   console.log(result);

看到这 ,前端常见的几种数据处理的疑难杂症已经解决的差不多了,当然呐,现实情况下还有许许多多的问题未收录进来,后续会陆陆续续慢慢更新收录下来,同时呢也希望有遇到JavaScript数据处理比较头疼的朋友可以与博主交流探讨,有好的解题思路的也可以反馈给到博主。

本文介绍了JavaScript开发过程中常见的5种数据处理问题并提供了对应的解决思路,基本覆盖了日常开发过程中的使用需求, 阅读本片文章可以大大提升你的javaScript基本功,在收到开发需求时,能快速响应,并给出解决方案。

【相关推荐:javascript视频教程、web前端】

以上就是解决JavaScript数据处理的5个常见问题的详细内容,更多请关注gxlsystem.com其它相关文章!

热门排行

今日推荐

热门手游