Javascript 递归函数未正确计算对象中的键

Javascript 递归函数未正确计算对象中的键,javascript,vue.js,Javascript,Vue.js,我有两个物体,长度相同,钥匙相同。唯一的区别是这些键可能具有不同的值。问题是,应该对这两个对象求值的方法都失败了——我花了好几个小时试图弄明白这一点 以下是原始参考资料: { "id":68, "article_id":12338, "article_reference_id":68, "article_reference_extraction_id":667320, "user_id":null, "file":"1238-230180-1-CE.doc

我有两个物体,长度相同,钥匙相同。唯一的区别是这些键可能具有不同的值。问题是,应该对这两个对象求值的方法都失败了——我花了好几个小时试图弄明白这一点

以下是原始参考资料:

{  
   "id":68,
   "article_id":12338,
   "article_reference_id":68,
   "article_reference_extraction_id":667320,
   "user_id":null,
   "file":"1238-230180-1-CE.doc",
   "revision":1,
   "order":1,
   "type":"journal",
   "preview":"Chewning B, Bylund CL, Shah B, Arora NK, Gueguen JA, Makoul G. Patient preferences for shared decisions: a systematic review. Patient Educ Couns 2012 Jan; 86(1):9-18",
   "status":1,
   "source":"Unknown",
   "data":{  
      "pii":"S0738-3991(11)00114-5",
      "webciteId":null,
      "publication":[  

      ],
      "conference":[  

      ],
      "authors":[  
         {  
            "firstName":"B",
            "lastName":"Chewning"
         },
         {  
            "firstName":"CL",
            "lastName":"Bylund"
         },
         {  
            "firstName":"B",
            "lastName":"Shah"
         },
         {  
            "firstName":"NK",
            "lastName":"Arora"
         },
         {  
            "firstName":"JA",
            "lastName":"Gueguen"
         },
         {  
            "firstName":"G",
            "lastName":"Makoul"
         }
      ],
      "editors":[  
         {  
            "firstName":"G",
            "lastName":"Makoul"
         }
      ],
      "comments":[  

      ],
      "source":{  
         "title":"Patient Educ Couns",
         "date":{  
            "year":"2012",
            "month":"01",
            "day":null
         },
         "pages":{  
            "from":"9",
            "to":"18"
         },
         "volume":"86",
         "issue":"1",
         "url":"http://europepmc.org/abstract/MED/21474265"
      },
      "accessDate":null,
      "articleTitle":"Patient preferences for shared decisions: a systematic review"
   },
   "doi":"10.1016/j.pec.2011.02.004",
   "pmid":21474265,
   "pmcid":null,
   "isbn":"",
   "created_at":"2019-04-09 10:04:53",
   "updated_at":"2019-04-09 10:04:53",
   "deleted_at":null,
   "max_revision":30,
   "extraction":{  
      "id":667320,
      "article_id":12338,
      "file":"1238-230180-1-CE.doc",
      "order":1,
      "original":"Chewning B, Bylund CL, Shah B, Arora NK, Gueguen JA, Makoul G. Patient preferences for shared decisions: A systematic review. Patient Educ Couns [Internet] Elsevier Ireland Ltd; 2012;86(1):9?18. PMID:21474265",
      "doi":null,
      "pmid":null,
      "isbn":null,
      "parsed":1,
      "created_at":"2019-02-25 18:40:46",
      "updated_at":"2019-02-25 18:40:46",
      "deleted_at":null
   }
}
{  
   "id":68,
   "article_id":12338,
   "article_reference_id":68,
   "article_reference_extraction_id":667320,
   "user_id":null,
   "file":"1238-230180-1-CE.doc",
   "revision":1,
   "order":1,
   "type":"journal",
   "preview":"Chewning B, Bylund CL, Shah B, Arora NK, Gueguen JA, Makoul G. Patient preferences for shared decisions: a systematic review. Patient Educ Couns 2012 Jan; 86(1):9-18",
   "status":1,
   "source":"Unknown",
   "data":{  
      "pii":" ",
      "webciteId":null,
      "publication":[  

      ],
      "conference":[  

      ],
      "authors":[  
         {  
            "lastName":"Chewning",
            "firstName":"Betty"
         },
         {  
            "lastName":"Bylund",
            "firstName":"Carma L."
         },
         {  
            "lastName":"Shah",
            "firstName":"Bupendra"
         },
         {  
            "lastName":"Arora",
            "firstName":"Neeraj K."
         },
         {  
            "lastName":"Gueguen",
            "firstName":"Jennifer A."
         },
         {  
            "lastName":null,
            "firstName":" "
         }
      ],
      "editors":[  
         {  
            "firstName":"G",
            "lastName":"Makoul"
         }
      ],
      "comments":[  

      ],
      "source":{  
         "title":"Patient Education and Counseling",
         "date":{  
            "year":2012,
            "month":1,
            "day":null
         },
         "pages":{  
            "from":"9",
            "to":"18"
         },
         "volume":"86",
         "issue":"1",
         "url":"http://europepmc.org/abstract/MED/21474265"
      },
      "accessDate":null,
      "articleTitle":"Patient preferences for shared decisions: A systematic review"
   },
   "doi":"10.1016/j.pec.2011.02.004",
   "pmid":21474265,
   "pmcid":null,
   "isbn":"",
   "created_at":"2019-04-09 10:04:53",
   "updated_at":"2019-04-09 10:04:53",
   "deleted_at":null,
   "max_revision":30,
   "extraction":{  
      "id":667320,
      "article_id":12338,
      "file":"1238-230180-1-CE.doc",
      "order":1,
      "original":"Chewning B, Bylund CL, Shah B, Arora NK, Gueguen JA, Makoul G. Patient preferences for shared decisions: A systematic review. Patient Educ Couns [Internet] Elsevier Ireland Ltd; 2012;86(1):9?18. PMID:21474265",
      "doi":null,
      "pmid":null,
      "isbn":null,
      "parsed":1,
      "created_at":"2019-02-25 18:40:46",
      "updated_at":"2019-02-25 18:40:46",
      "deleted_at":null
   }
}

这里是
参考

{  
   "id":68,
   "article_id":12338,
   "article_reference_id":68,
   "article_reference_extraction_id":667320,
   "user_id":null,
   "file":"1238-230180-1-CE.doc",
   "revision":1,
   "order":1,
   "type":"journal",
   "preview":"Chewning B, Bylund CL, Shah B, Arora NK, Gueguen JA, Makoul G. Patient preferences for shared decisions: a systematic review. Patient Educ Couns 2012 Jan; 86(1):9-18",
   "status":1,
   "source":"Unknown",
   "data":{  
      "pii":"S0738-3991(11)00114-5",
      "webciteId":null,
      "publication":[  

      ],
      "conference":[  

      ],
      "authors":[  
         {  
            "firstName":"B",
            "lastName":"Chewning"
         },
         {  
            "firstName":"CL",
            "lastName":"Bylund"
         },
         {  
            "firstName":"B",
            "lastName":"Shah"
         },
         {  
            "firstName":"NK",
            "lastName":"Arora"
         },
         {  
            "firstName":"JA",
            "lastName":"Gueguen"
         },
         {  
            "firstName":"G",
            "lastName":"Makoul"
         }
      ],
      "editors":[  
         {  
            "firstName":"G",
            "lastName":"Makoul"
         }
      ],
      "comments":[  

      ],
      "source":{  
         "title":"Patient Educ Couns",
         "date":{  
            "year":"2012",
            "month":"01",
            "day":null
         },
         "pages":{  
            "from":"9",
            "to":"18"
         },
         "volume":"86",
         "issue":"1",
         "url":"http://europepmc.org/abstract/MED/21474265"
      },
      "accessDate":null,
      "articleTitle":"Patient preferences for shared decisions: a systematic review"
   },
   "doi":"10.1016/j.pec.2011.02.004",
   "pmid":21474265,
   "pmcid":null,
   "isbn":"",
   "created_at":"2019-04-09 10:04:53",
   "updated_at":"2019-04-09 10:04:53",
   "deleted_at":null,
   "max_revision":30,
   "extraction":{  
      "id":667320,
      "article_id":12338,
      "file":"1238-230180-1-CE.doc",
      "order":1,
      "original":"Chewning B, Bylund CL, Shah B, Arora NK, Gueguen JA, Makoul G. Patient preferences for shared decisions: A systematic review. Patient Educ Couns [Internet] Elsevier Ireland Ltd; 2012;86(1):9?18. PMID:21474265",
      "doi":null,
      "pmid":null,
      "isbn":null,
      "parsed":1,
      "created_at":"2019-02-25 18:40:46",
      "updated_at":"2019-02-25 18:40:46",
      "deleted_at":null
   }
}
{  
   "id":68,
   "article_id":12338,
   "article_reference_id":68,
   "article_reference_extraction_id":667320,
   "user_id":null,
   "file":"1238-230180-1-CE.doc",
   "revision":1,
   "order":1,
   "type":"journal",
   "preview":"Chewning B, Bylund CL, Shah B, Arora NK, Gueguen JA, Makoul G. Patient preferences for shared decisions: a systematic review. Patient Educ Couns 2012 Jan; 86(1):9-18",
   "status":1,
   "source":"Unknown",
   "data":{  
      "pii":" ",
      "webciteId":null,
      "publication":[  

      ],
      "conference":[  

      ],
      "authors":[  
         {  
            "lastName":"Chewning",
            "firstName":"Betty"
         },
         {  
            "lastName":"Bylund",
            "firstName":"Carma L."
         },
         {  
            "lastName":"Shah",
            "firstName":"Bupendra"
         },
         {  
            "lastName":"Arora",
            "firstName":"Neeraj K."
         },
         {  
            "lastName":"Gueguen",
            "firstName":"Jennifer A."
         },
         {  
            "lastName":null,
            "firstName":" "
         }
      ],
      "editors":[  
         {  
            "firstName":"G",
            "lastName":"Makoul"
         }
      ],
      "comments":[  

      ],
      "source":{  
         "title":"Patient Education and Counseling",
         "date":{  
            "year":2012,
            "month":1,
            "day":null
         },
         "pages":{  
            "from":"9",
            "to":"18"
         },
         "volume":"86",
         "issue":"1",
         "url":"http://europepmc.org/abstract/MED/21474265"
      },
      "accessDate":null,
      "articleTitle":"Patient preferences for shared decisions: A systematic review"
   },
   "doi":"10.1016/j.pec.2011.02.004",
   "pmid":21474265,
   "pmcid":null,
   "isbn":"",
   "created_at":"2019-04-09 10:04:53",
   "updated_at":"2019-04-09 10:04:53",
   "deleted_at":null,
   "max_revision":30,
   "extraction":{  
      "id":667320,
      "article_id":12338,
      "file":"1238-230180-1-CE.doc",
      "order":1,
      "original":"Chewning B, Bylund CL, Shah B, Arora NK, Gueguen JA, Makoul G. Patient preferences for shared decisions: A systematic review. Patient Educ Couns [Internet] Elsevier Ireland Ltd; 2012;86(1):9?18. PMID:21474265",
      "doi":null,
      "pmid":null,
      "isbn":null,
      "parsed":1,
      "created_at":"2019-02-25 18:40:46",
      "updated_at":"2019-02-25 18:40:46",
      "deleted_at":null
   }
}
注意
originalReference
中的
article title
如何有打字错误,但是
reference
中的
article title
有正确的标题

下面函数的要点是确保如果
originalReference
以前有一个键的非空/非空/定义值,
reference
不应覆盖
originalReference
中的值

这是一个函数,它同时计算这两个参数

发生的情况是,它抛出了一个错误
TypeError:无法读取未定义的属性'articleTitle'。不知道发生了什么

以下是函数:

evaluateEmptyValues: function(reference, originalReference) {
    var vm = this;

    console.log('reference', reference);
    console.log('Before   --> ' + reference.data.articleTitle);

    // Get keys and values of both reference objects
    referenceLength = Object.entries(reference).length;
    originalReferenceLength = Object.entries(originalReference).length;

    if (referenceLength == originalReferenceLength) {
        try {
            for (var prop in reference) {
                    if (reference[prop] != undefined || reference[prop] != null) {
                        if (typeof (reference[prop]) == 'string' && reference[prop].trim() == '') {
                            reference[prop] = originalReference[prop];
                        }

                        if (typeof(reference[prop]) == 'object' && typeof(originalReference[prop]) == 'object') {
                            console.log('reference[prop]', reference[prop]);
                            console.log('originalReference[prop]', originalReference);
                            vm.evaluateEmptyValues(reference[prop], originalReference[prop]);
                        }

                        if (Array.isArray(reference[prop]) && typeof Array.isArray(originalReference[prop])) {
                            reference[prop].forEach((item, index) => vm.evaluateEmptyValues(item, originalReference[prop][index]));
                        }
                } else {
                    reference[prop] = originalReference[prop];
                }
            }
        } catch(err) {
            console.log(err);
        }
    }

    console.log('After    --> ' + reference.data.articleTitle);
    //
    // console.log('Original --> ' + originalReference.data.articleTitle);
}
难道你不该排队吗

if (reference[prop] != undefined || reference[prop] != null) {
用一个和,像这样

if (reference[prop] != undefined && reference[prop] != null) {

让它和这个一起工作:

evaluateEmptyValues: function(reference, originalReference) {
    var vm = this;

    // Get keys and values of both reference objects
    referenceLength = Object.entries(reference).length;
    originalReferenceLength = Object.entries(originalReference).length;

    if (referenceLength == originalReferenceLength) {
        try {
            for (var prop in reference) {
                if (reference[prop] != undefined || reference[prop] != null) {
                    if (typeof (reference[prop]) == 'string' && reference[prop].trim() == '') {
                        reference[prop] = originalReference[prop];
                    }

                    if (typeof(reference[prop]) == 'object' && typeof(originalReference[prop]) == 'object') {

                        var length = Object.keys(reference[prop]).length;
                        for (var property in reference[prop]) {
                            if (originalReference[prop][property] != undefined) {
                                if (originalReference[prop][property] != null) {
                                    // vm.evaluateEmptyValues(reference[prop][property], originalReference[prop][property]);
                                    for (var i = 0; i < property.length; i++) {
                                        if ((reference[prop][property] == null || reference[prop][property] == '') &&
                                            originalReference[prop][property] != null) {
                                            reference[prop][property] = originalReference[prop][property];
                                        }
                                    }
                                }
                            }
                        }
                    }

                    if (Array.isArray(reference[prop]) && typeof Array.isArray(originalReference[prop])) {
                        reference[prop].forEach((item, index) => vm.evaluateEmptyValues(item, originalReference[prop][index]));
                    }
                } else {
                    if (originalReference[prop] != undefined) {
                        if (originalReference[prop] != null) {
                            reference[prop] = originalReference[prop];
                        }
                    }
                }
            }
        } catch(err) {
            console.log(err);
        }
    }
},
evaluatemptyvalues:函数(引用,原始引用){
var vm=这个;
//获取两个参照对象的键和值
referenceLength=Object.entries(reference).length;
originalReferenceLength=Object.entries(originalReference).length;
if(referenceLength==原始referenceLength){
试一试{
for(参考中的var prop){
if(reference[prop]!=未定义| | reference[prop]!=null){
if(typeof(reference[prop])='string'&&reference[prop].trim(){
参考[prop]=原始参考[prop];
}
if(typeof(reference[prop])==“object”&&typeof(originalReference[prop])==“object”){
变量长度=Object.keys(参考[prop]).length;
for(引用[prop]中的var属性){
if(原始引用[prop][property]!=未定义){
if(原始引用[prop][property]!=null){
//vm.EvaluateEmptyValue(参考[prop][property],原始参考[prop][property]);
对于(变量i=0;ivm.evaluatemptyvalues(项目,原始引用[prop][index]);
}
}否则{
if(原始参考[prop]!=未定义){
if(原始引用[prop]!=null){
参考[prop]=原始参考[prop];
}
}
}
}
}捕捉(错误){
控制台日志(err);
}
}
},

您希望最终得到什么?您是否正在尝试重复合并?因为有和没有,因为如果其中一个是真的,我希望它点击
else
。可能
reference[prop]==null
reference[prop]==undefined
。。但是
originalReference[prop]
可能不是,所以我想分配
reference[prop]=originalReference[prop]。如果
originalReference[prop]==null | | | originalReference[prop]==undefined
,那也没关系——没有任何变化