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

问题描述 投票:0回答:2

我想比较两个文件(实际上是同一个记录的当前和以前的版本),以确定是否对文件的根数组的内容是不同的。但是,我专门找是根阵列中的嵌入式阵列上的变化。

我的文档结构看起来是这样的:

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

我如何检查,看看是否有在“历史”阵列的水平两个文件之间的差异?

javascript arrays
2个回答
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)

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)

它看起来递归的差异,无论是结构。

© www.soinside.com 2019 - 2024. All rights reserved.