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

时间:2019-02-05 18:46:00

标签: javascript arrays

我正在尝试比较两个文档(实际上是同一记录的当前版本和先前版本),以确定文档根目录上的数组内容是否不同。但是我专门寻找的是在根数组中 内的嵌入式数组的更改。

我的文档结构如下:

{
  _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
        }
      ]
    },
  ]   
}

如何检查“历史”数组级别的两个文档之间是否存在差异?

2 个答案:

答案 0 :(得分:2)

比较所有_idtitle

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)

答案 1 :(得分:0)

您可以使用此:

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)

无论结构如何,都会递归查找差异。