Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/369.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 修正了object diff算法以创建数组而不是对象_Javascript - Fatal编程技术网

Javascript 修正了object diff算法以创建数组而不是对象

Javascript 修正了object diff算法以创建数组而不是对象,javascript,Javascript,我正在尝试建立一个算法,可以输出两个对象之间的差异。当typeof对象是数组时,我不知道如何创建数组。我知道这和枚举数组时返回的第一个键有关,索引是字符串;"0". 因此,它将“0”指定为对象,而不是数组 function difference(o1, o2) { var k; var kDiff; var diff = {}; for (k in o1)

我正在尝试建立一个算法,可以输出两个对象之间的差异。当typeof对象是数组时,我不知道如何创建数组。我知道这和枚举数组时返回的第一个键有关,索引是字符串;"0". 因此,它将“0”指定为对象,而不是数组

    function difference(o1, o2) {

                var k;
                var kDiff;
                var diff = {};

                for (k in o1)
                {
                    if (!o1.hasOwnProperty(k)) { }
                    else if (typeof o1[k] != 'object' || typeof o2[k] != 'object')
                    {
                        if (!(k in o2) || o1[k] !== o2[k]){
                            diff[k] = o2[k];
                        }
                    } else if (kDiff = difference(o1[k], o2[k]))
                    {
                        diff[k] = kDiff;
                    }
                }
                for (k in o2)
                {
                    if (o2.hasOwnProperty(k) && (!o1 || !(k in o1)))
                    {
                        diff[k] = o2[k];
                    }
                }
                for (k in diff)
                {
                    if (diff.hasOwnProperty(k))
                    {
                        return diff;
                    }
                }

                return false;
            }
测试用例

    function difference(o1, o2) {

                var k;
                var kDiff;
                var diff = {};

                for (k in o1)
                {
                    if (!o1.hasOwnProperty(k)) { }
                    else if (typeof o1[k] != 'object' || typeof o2[k] != 'object')
                    {
                        if (!(k in o2) || o1[k] !== o2[k]){
                            diff[k] = o2[k];
                        }
                    } else if (kDiff = difference(o1[k], o2[k]))
                    {
                        diff[k] = kDiff;
                    }
                }
                for (k in o2)
                {
                    if (o2.hasOwnProperty(k) && (!o1 || !(k in o1)))
                    {
                        diff[k] = o2[k];
                    }
                }
                for (k in diff)
                {
                    if (diff.hasOwnProperty(k))
                    {
                        return diff;
                    }
                }

                return false;
            }
    var lhs = {
        "Id": 1,
        "Type" : "Mortgage",
        "Amount": 500000,
        "Rate" : .045,
        "Borrowers": [
            {
                "Id": 1,
                "FirstName": "Jon",
                "Employment": [
                    {
                        "Id": 1,
                        "Employer": "Walmart",
                        "Income": [
                            {
                                "Id": 1,
                                "MonthlyIncome": 5000,
                                "Type": "Base"
                            },
                            {
                                "Id": 2,
                                "MonthlyIncome": 1000,
                                "Type": "Overtime"
                            }
                        ]
                    }
                ]

            }

        ]
    }
    var rhs = {
        "Id": 1,
        "Type" : "Mortgage",
        "Amount": 500001,
        "Rate" : .045,
        "Borrowers": [
            {
                "Id": 1,
                "FirstName": "Don",
                "Employment": [
                    {
                        "Id": 1,
                        "Employer": "Walmart",
                        "Income": [
                            {
                                "Id": 1,
                                "MonthlyIncome": 5000,
                                "Type": "Base"
                            },
                            {
                                "Id": 2,
                                "MonthlyIncome": 500,
                                "Type": "Other"
                            }
                        ]
                    }
                ]

            }

        ]
    }

    var changes = JSON.stringify(difference(lhs, rhs);
预期结果:

    function difference(o1, o2) {

                var k;
                var kDiff;
                var diff = {};

                for (k in o1)
                {
                    if (!o1.hasOwnProperty(k)) { }
                    else if (typeof o1[k] != 'object' || typeof o2[k] != 'object')
                    {
                        if (!(k in o2) || o1[k] !== o2[k]){
                            diff[k] = o2[k];
                        }
                    } else if (kDiff = difference(o1[k], o2[k]))
                    {
                        diff[k] = kDiff;
                    }
                }
                for (k in o2)
                {
                    if (o2.hasOwnProperty(k) && (!o1 || !(k in o1)))
                    {
                        diff[k] = o2[k];
                    }
                }
                for (k in diff)
                {
                    if (diff.hasOwnProperty(k))
                    {
                        return diff;
                    }
                }

                return false;
            }
{
    "Amount": 500001,
    "Borrowers": [
        {
            "FirstName": "Don",
            "Employment": [
                {
                    "Income": [
                        {
                            "MonthlyIncome": 500,
                            "Type": "Other"
                        }
                    ]
                }
            ]
        }
    ]
}
{
    "Amount": 500001,
    "Borrowers": {
        "0": {
            "FirstName": "Don",
            "Employment": {
                "0": {
                    "Income": {
                        "1": {
                            "MonthlyIncome": 500,
                            "Type": "Other"
                        }
                    }
                }
            }
        }
    }
}
不是:

    function difference(o1, o2) {

                var k;
                var kDiff;
                var diff = {};

                for (k in o1)
                {
                    if (!o1.hasOwnProperty(k)) { }
                    else if (typeof o1[k] != 'object' || typeof o2[k] != 'object')
                    {
                        if (!(k in o2) || o1[k] !== o2[k]){
                            diff[k] = o2[k];
                        }
                    } else if (kDiff = difference(o1[k], o2[k]))
                    {
                        diff[k] = kDiff;
                    }
                }
                for (k in o2)
                {
                    if (o2.hasOwnProperty(k) && (!o1 || !(k in o1)))
                    {
                        diff[k] = o2[k];
                    }
                }
                for (k in diff)
                {
                    if (diff.hasOwnProperty(k))
                    {
                        return diff;
                    }
                }

                return false;
            }
{
    "Amount": 500001,
    "Borrowers": [
        {
            "FirstName": "Don",
            "Employment": [
                {
                    "Income": [
                        {
                            "MonthlyIncome": 500,
                            "Type": "Other"
                        }
                    ]
                }
            ]
        }
    ]
}
{
    "Amount": 500001,
    "Borrowers": {
        "0": {
            "FirstName": "Don",
            "Employment": {
                "0": {
                    "Income": {
                        "1": {
                            "MonthlyIncome": 500,
                            "Type": "Other"
                        }
                    }
                }
            }
        }
    }
}

我对您试图做的事情有点困惑,但如果使用lodash,是否有帮助

    function difference(o1, o2) {

                var k;
                var kDiff;
                var diff = {};

                for (k in o1)
                {
                    if (!o1.hasOwnProperty(k)) { }
                    else if (typeof o1[k] != 'object' || typeof o2[k] != 'object')
                    {
                        if (!(k in o2) || o1[k] !== o2[k]){
                            diff[k] = o2[k];
                        }
                    } else if (kDiff = difference(o1[k], o2[k]))
                    {
                        diff[k] = kDiff;
                    }
                }
                for (k in o2)
                {
                    if (o2.hasOwnProperty(k) && (!o1 || !(k in o1)))
                    {
                        diff[k] = o2[k];
                    }
                }
                for (k in diff)
                {
                    if (diff.hasOwnProperty(k))
                    {
                        return diff;
                    }
                }

                return false;
            }

根据@Kaddath的提示,返回的差异必须根据要计算的对象类型定义:

    function difference(o1, o2) {

                var k;
                var kDiff;
                var diff = {};

                for (k in o1)
                {
                    if (!o1.hasOwnProperty(k)) { }
                    else if (typeof o1[k] != 'object' || typeof o2[k] != 'object')
                    {
                        if (!(k in o2) || o1[k] !== o2[k]){
                            diff[k] = o2[k];
                        }
                    } else if (kDiff = difference(o1[k], o2[k]))
                    {
                        diff[k] = kDiff;
                    }
                }
                for (k in o2)
                {
                    if (o2.hasOwnProperty(k) && (!o1 || !(k in o1)))
                    {
                        diff[k] = o2[k];
                    }
                }
                for (k in diff)
                {
                    if (diff.hasOwnProperty(k))
                    {
                        return diff;
                    }
                }

                return false;
            }
功能差异(o1,o2){

    function difference(o1, o2) {

                var k;
                var kDiff;
                var diff = {};

                for (k in o1)
                {
                    if (!o1.hasOwnProperty(k)) { }
                    else if (typeof o1[k] != 'object' || typeof o2[k] != 'object')
                    {
                        if (!(k in o2) || o1[k] !== o2[k]){
                            diff[k] = o2[k];
                        }
                    } else if (kDiff = difference(o1[k], o2[k]))
                    {
                        diff[k] = kDiff;
                    }
                }
                for (k in o2)
                {
                    if (o2.hasOwnProperty(k) && (!o1 || !(k in o1)))
                    {
                        diff[k] = o2[k];
                    }
                }
                for (k in diff)
                {
                    if (diff.hasOwnProperty(k))
                    {
                        return diff;
                    }
                }

                return false;
            }

}

只是提示:
typeof[]
返回“object”而不是“array”(改用)。然后定义
diff={}
这样这里就不能有数组了..我不知道lodash中的这个功能。我还有另一个要求,即如果对象中的任何其他字段值发生更改,则始终包括“Id”字段和值。使用lodash transform有办法做到这一点吗?@ddrjca您在
函数(结果、值、键)
中有
键和
,因此,是的,您只需要测试
键是否=='Id'
,如果是这样的话,就将其分配给
结果
    function difference(o1, o2) {

                var k;
                var kDiff;
                var diff = {};

                for (k in o1)
                {
                    if (!o1.hasOwnProperty(k)) { }
                    else if (typeof o1[k] != 'object' || typeof o2[k] != 'object')
                    {
                        if (!(k in o2) || o1[k] !== o2[k]){
                            diff[k] = o2[k];
                        }
                    } else if (kDiff = difference(o1[k], o2[k]))
                    {
                        diff[k] = kDiff;
                    }
                }
                for (k in o2)
                {
                    if (o2.hasOwnProperty(k) && (!o1 || !(k in o1)))
                    {
                        diff[k] = o2[k];
                    }
                }
                for (k in diff)
                {
                    if (diff.hasOwnProperty(k))
                    {
                        return diff;
                    }
                }

                return false;
            }