代码之家  ›  专栏  ›  技术社区  ›  Muirik

检查嵌入在另一个数组中的数组中的文档之间的差异

  •  0
  • Muirik  · 技术社区  · 7 年前

    我试图比较两个文档(实际上是同一记录的当前版本和以前版本),以确定文档根上数组的内容是否不同。但我所说的 明确地 正在查找嵌入式阵列上的更改 在内部 那个根数组。

    我的文档结构如下所示:

    {
      _id: 1,
      name: { 
        first: "John",
        last: "Smith"
      },
      services: [
        { 
          service: "serviceOne",
          // I want to detect differences at this "history" array level
          history: [ 
            { 
              _id: <ObjectId>,
              title: value
            },
            { 
              _id: <ObjectId>,
              title: value
            }
          ]
        },
        { 
          service: "serviceTwo",
          history: [
            { 
              _id: <ObjectId>,
              title: value
            },
            { 
              _id: <ObjectId>,
              title: value
            }
          ]
        },
      ]   
    }
    

    如何检查这两个文档在“history”数组级别上是否存在差异?

    2 回复  |  直到 7 年前
        1
  •  2
  •   Jonas Wilms    7 年前

    比较 _id 和 title

    const compare = cb => (a, b) => a.length === b.length && a.every((el, i) => cb(el, b[i]));
    const take = (key, cb) => (a, b) => cb(a[key], b[key]);
    
    const equal = take("services", compare(
      take("history", compare(
        (a, b) => a._id === b._id && a.title === b.title
      ))
    ))(obj, obj2);
    

    或者,如果两个版本之间的格式(键顺序)没有更改,则可以简化为:

     JSON.stringify(obj) === JSON.stringify(obj2)
    
        2
  •  0
  •   Manuel Otto    7 年前

    function compareObjects(obj1,obj2,reversed){
        for(var key in obj1){
            if(typeof obj2[key]=="undefined") return false
            if(typeof obj1[key] == "object"){
                if(!compareObjects(obj1[key],obj2[key])) return false
            }
            else if(obj1[key]!=obj2[key]) return false
        }
        return reversed ? true : compareObjects(obj2,obj1,true)
    }
    

    通过

    var new_history = new_document.services.map(service=>service.history)
    var old_history = old_document.services.map(service=>service.history)
    var are_identical = compareObjects(new_history,old_history)