聊聊json数组的去重和排序

首先,我们得明确一下json数组是什么呢?像[{key:1,data:1},{key:2,data:2}]这样得数组,每一个值都是由json对象组成得数组,我们可以称为json数组。

在进行json对象操作前我们需要了解以下几点内容

1.栈内存和堆内存

在js引擎中对变量的存储主要有两种位置,堆内存和栈内存。
栈内存主要用于存储各种基本类型的变量,包括Boolean、Number、String、Undefined、Null。栈内存中的变量一般都是已知大小或者有范围上限的,算作一种简单存储。

而堆内存主要负责像对象Object、Array这种引用数据类型的存储,对于存储的数据大小这方面,一般都是未知的。

栈内存是直接存取数据的,而堆内存是指向存取数据所在的地址,这点很重用!!!

2.浅拷贝和深拷贝

浅拷贝和深拷贝这也是一个非常常见的前端面试题。这两个概念主要是针对引用数据类型的。上面我们有说过引用数据类型是存取数据所在的地址,而平常我们修改数组、对象的时候是直接修改对应地址里面的数据。当我们让一个新的数据等于一个旧的数据如var newarr = oldarr,这时候我们直接对newarr进行修改时,就会直接修改newarr对应的内存地址里面的数据。这时候,我们可以发现oldarr也被更改了并且数据与newarr一样。为了不让这种情况出现,于是就有了与之对应的深拷贝。
深拷贝简单来说就是重新开辟一个新的内存空间,然后让我们的对象、数组指向这个新的内存空间,然后我们对这个新的内存空间进行修改时是不会影响到旧的数组、对象。因为他们指向了不同的内存空间

	/**
     * @description: 判断数据类型
     * @Date: 2020-04-30 00:42:17
     * @author: 小羽
     * @param {type} 
     * @return: 数据类型(如boolean,number,string等)
     */
    getType(obj) {
        let map = {
            '[object Boolean]': 'boolean',
            '[object Number]': 'number',
            '[object String]': 'string',
            '[object Function]': 'function',
            '[object Array]': 'array',
            '[object Date]': 'date',
            '[object RegExp]': 'regExp',
            '[object Undefined]': 'undefined',
            '[object Null]': 'null',
            '[object Object]': 'object'
        };
        return map[Object.prototype.toString.call(obj)];
    }

	/**
     * @description: 深拷贝
     * @Date: 2020-04-30 00:44:01
     * @author: 小羽
     * @param {type} 
     * @return: 进行深拷贝后的data
     */
    deepClone(data){
        let type = this.getType(data);
        let obj;
        if(type === 'array'){
            obj = [];
        } else if(type === 'object'){
            obj = {};
        } else {
            //不再具有下一层次
            return data;
        }
        if(type === 'array'){
            for(let i = 0, len = data.length; i < len; i++){
                obj.push(this.deepClone(data[i]));
            }
        } else if(type === 'object'){
            for(let key in data){
                obj[key] = this.deepClone(data[key]);
            }
        }
        return obj;
    }
    

3.json数组的去重和排序

json数组的去重和排序,其实与普通数组思路基本一样,只是多了一个json的健值。关键点就在于深拷贝,因为不使用深拷贝的话则会直接操作原始数组所指向的内存数据,导致排序的异常。

	/**
     * @description: json对象数组,根据key值去重
     * @Date: 2020-05-04 22:55:38
     * @author: 小羽
     * @param {type} 
     * arr json对象数组
     * key json对象的健值,根据该健值进行去重
     * @return: 
     */
    uniqueJsonArr(arr,key){
        let newObj = []
        for(let item of arr){
            let tag = true
            for(let item1 of newObj){
                if(item[key]==item1[key]){
                    tag = false
                }
            } 
            if(tag){
                newObj.push(item)
            }
        }
        return newObj
    }

    /**
     * @description: json对象数组,根据key值排序
     * @Date: 2020-05-04 23:06:18
     * @author: 小羽
     * @param {type} 
     * arr json对象数组
     * key json对象的健值,根据该值进行去重
     * type 排序方式,默认为asc,即升序
     * @return: 
     */
    sortJsonArr(arr,key,type="asc"){
        let newArr = this.deepClone(arr)
        if(type ==="desc"){
            for(let item of newArr){
                for(let item1 of newArr){
                    if(item[key]<item1[key]){
                        let newObj = this.deepClone(item[key])
                        item[key] = this.deepClone(item1[key])
                        item1[key] = newObj
                    }
                }
            }
        }else{
            for(let item of newArr){
                for(let item1 of newArr){
                    if(item[key]>item1[key]){
                        let newObj = this.deepClone(item[key])
                        item[key] = this.deepClone(item1[key])
                        item1[key] = newObj
                    }
                }
            }
        }
        return newArr
        
    }
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值