空对象动态添加属性(面试常考)返回JSON,曾经惨败的一道面试题

这里写图片描述

<!doctype html>
<html lang="en">

    <head>
        <meta charset="UTF-8" />
        <title>Document</title>
        <script type="text/javascript">
            var b = ['a', 'b', 'c'];
            var a = {};
            a[b[0]] = 'aaaaaaa';
            a[b[1]] = 'bbbbbbb';
            a[b[2]] = 'ccccccc';
            for (var i in a) {
                console.log(i + ':' + a[i]);
            }
            console.log(a);
            if (!('w' in a)) {
                a['w'] = 123;
            }
            for (var i in a) {
                console.log(i + ':' + a[i]);
            }
            console.log(a);
            console.log(JSON.stringify(a));
        </script>
    </head>

    <body>

    </body>

</html>

这里写图片描述

<!doctype html>
<html lang="en">

    <head>
        <meta charset="UTF-8" />
        <title>Document</title>
        <script type="text/javascript">
            var a = ['a', 'abc', 'abcd', 'a', 'a', 'a', 'a', 'abc'];
            var obj = {};
            var Obj2 = {};
            console.log('-------------------第一种方法-------------------');
            for (var i = 0; i < a.length; i++) {
                if (!Obj2[a[i]]) {
                    Obj2[a[i]] = 1;
                } else {
                    Obj2[a[i]]++;
                }
            }
            console.log(Obj2);
            console.log(JSON.stringify(Obj2));
            console.log(Obj2.a)
            console.log('-------------------第二种方法-------------------');
            for (var i = 0; i < a.length; i++) {
                if (!(a[i] in obj)) {
                    obj[a[i]] = 1;
                } else {
                    obj[a[i]]++;
                }
            }
            console.log(obj);
            console.log(JSON.stringify(obj));
            console.log(obj.a)
        </script>
    </head>

    <body>

    </body>

</html>

拓展阅读 $.extend,JSON.stringify() ,JSON.parse()

这里写图片描述

<!doctype html>
<html lang="en">

    <head>
        <meta charset="UTF-8" />
        <script type="text/javascript" src="jquery-2.2.4.min.js"></script>

        <title>Document</title>
        <script type="text/javascript">
            var a = {
                "name": "libin",
                "age": "30"
            };
            var b = {
                "name": "libin",
                "sex": "男"
            };
            var c = $.extend({},a, b);  //如果写成$.extend(a, b)会改变a对象的结构
            console.log(c);
            var d = JSON.stringify(c);
            console.log(d + ",对象类型是:" + typeof d + ",d.name的值:" + d.name);
            var e = JSON.parse(d);
            console.log(e);
            console.log(e + ",对象类型是:" + typeof e + ",e.name的值:" + e.name);
        </script>
    </head>

    <body>

    </body>

</html>

比较两个JSON是否相等

<!DOCTYPE html>
<html>

    <head>
        <meta charset="UTF-8">
        <title>比较两个JSON是否相等</title>
        <script type="text/javascript">
            var jsonObjA = {
                "Name": "MyName",
                "Company": "MyCompany",
                "Infos": [{
                    "Age": "100"
                }, {
                    "Box": [{
                        "Height": "100"
                    }, {
                        "Weight": "200"
                    }]
                }],
                "Address": "马栏山"
            }
            var jsonObjB = {
                "Address": "马栏山",
                "Name": "MyName",
                "Company": "MyCompany",
                "Infos": [{
                    "Age": "100"
                }, {
                    "Box": [{
                        "Height": "100"
                    }, {
                        "Weight": "200"
                    }]
                }],

            }
            console.log("方法有局限:将JSON的对象序列换一下:'Address': '马栏山'");
            console.log(JSON.stringify(jsonObjA) == JSON.stringify(jsonObjB));
        </script>
        <script type="text/javascript">
            function isObj(object) {
                return object && typeof(object) == 'object' && Object.prototype.toString.call(object).toLowerCase() == "[object object]";
            }

            function isArray(object) {
                return object && typeof(object) == 'object' && object.constructor == Array;
            }

            function getLength(object) {
                var count = 0;
                for(var i in object) count++;
                return count;
            }

            function Compare(objA, objB) {
                if(!isObj(objA) || !isObj(objB)) return false; //判断类型是否正确
                if(getLength(objA) != getLength(objB)) return false; //判断长度是否一致
                return CompareObj(objA, objB, true); //默认为true
            }

            function CompareObj(objA, objB, flag) {
                for(var key in objA) {
                    if(!flag) //跳出整个循环
                        break;
                    if(!objB.hasOwnProperty(key)) {
                        flag = false;
                        break;
                    }
                    if(!isArray(objA[key])) { //子级不是数组时,比较属性值
                        if(objB[key] != objA[key]) {
                            flag = false;
                            break;
                        }
                    } else {
                        if(!isArray(objB[key])) {
                            flag = false;
                            break;
                        }
                        var oA = objA[key],
                            oB = objB[key];
                        if(oA.length != oB.length) {
                            flag = false;
                            break;
                        }
                        for(var k in oA) {
                            if(!flag) //这里跳出循环是为了不让递归继续
                                break;
                            flag = CompareObj(oA[k], oB[k], flag);
                        }
                    }
                }
                return flag;
            }
            var result = Compare(jsonObjA, jsonObjB);
            console.log(result); // true or false
        </script>
    </head>

    <body>
    </body>

</html>
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值