JavaScript 比较两个 JSON 文件并仅输出新对象

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

我想比较两个 JSON 文件并根据“Id”仅输出新添加的对象。我还需要忽略 JSON 文件中对象位置的更改(我不想比较行更改)。

您会在下面的代码中注意到 Greg 的年龄发生了变化 - 我也不想在我的输出中包含此类(键:值)更改。

我目前正在使用一个名为 json-diff 的包。

这是我当前的代码:

const jsonDiff = require('json-diff');

var oldJson = {
    "data": [ 
      {
        "Id": "2",
        "Name": "Greg",
        "ranges": [
          {
            "age": "70"
          }
        ]
      },
      {
        "Id": "1",
        "Name": "Tom",
        "ranges": [
          {
            "age": "10"
          }
        ]
      }
    ]
};

var newJson = {
    "data": [
      {
        "Id": "2",
        "Name": "Greg",
        "ranges": [
          {
            "age": "20" // Even though Greg's age has changed, I don't want it in my output
          }
        ]
      },
      {
        "Id": "3",
        "Name": "Bob",
        "ranges": [
          {
            "age": "30"
          }
        ]
      },  
      {
        "Id": "1",
        "Name": "Tom",
        "ranges": [
          {
            "age": "10"
          }
        ]
      }
    ]
};

function compare(newJson, oldJson) {
    let rawDiff = jsonDiff.diff(newJson.data, oldJson.data);
    let prettyDiff = JSON.stringify(rawDiff).replace(/,\[" "]/g, '');
    console.log(prettyDiff);
}

compare(newJson, oldJson);

电流输出:

[
  [
    "~",
    {
      "ranges": [
        [
          "-",
          {
            "age": "20"
          }
        ],
        [
          "+",
          {
            "age": "70"
          }
        ]
      ]
    }
  ],
  [
    "-",
    {
      "Id": "3",
      "Name": "Bob",
      "ranges": [
        {
          "age": "30"
        }
      ]
    }
  ]
]

所需输出:

{
    "data": [
      {
        "Id": "3",
        "Name": "Bob",
        "ranges": [
          {
            "age": "30"
          }
        ]
      }
    ]
}
javascript node.js json compare diff
3个回答
2
投票

我不确定这是否是您的需要,但是

var oldJson = {
    "data": [ 
      { "Id": "2", "Name": "Greg", "ranges": [ { "age": "70" } ] },
      { "Id": "1", "Name": "Tom", "ranges": [ { "age": "10" } ] }
    ]
};

var newJson = {
    "data": [
        { "Id": "2", "Name": "Greg", "ranges": [ { "age": "20" } ] },
        { "Id": "3", "Name": "Bob", "ranges": [ { "age": "30" } ] },  
        { "Id": "1", "Name": "Tom", "ranges": [ { "age": "10" } ] }
    ]
};

function compare(newJson, oldJson) {
    // get Id's from oldJson
    let ids = oldJson.data.map(ch => ch.Id);
    // filter from newJson that's not inside from old ids
    return newJson.data.filter(ch => !ids.includes(ch.Id));
}

console.log(compare(newJson, oldJson)); // [ { Id: '3', Name: 'Bob', ranges: [ [Object] ] } ]

0
投票

对于那些需要解决更复杂问题的人:

    function compareJsonArrays(currentArray, newArray) {
        const diff = {
            newItems: [],
            deletedItems: [],
            updatedItems: []
        };

        const currentSet = new Set(currentArray.map(item => item.id));
        const newSet = new Set(newArray.map(item => item.id));

        for (const element of newArray) {
            if (!currentSet.has(element.id)) {
                diff.newItems.push(element);
            } else {
                const currentItemIndex = currentArray.findIndex(item => item.id === element.id);
                if (!compareObjects(element, currentArray[currentItemIndex])) {
                    diff.updatedItems.push(element);
                }
            }
        }

        for (const element of currentArray) {
            if (!newSet.has(element.id)) {
                diff.deletedItems.push(element);
            }
        }

        return diff;
    }

    function compareObjects(obj1, obj2) {
        return JSON.stringify(obj1) === JSON.stringify(obj2);
    }

0
投票

嗨,您可能想看看

https://eggachecat.github.io/jycm-viewer/

{
  "operators": [
    {
      "name": "operator:list:matchWithField",
      "args": [
        "^data->\\[\\d+\\]$",
        "Id"
      ]
    }
  ],
  "ignore_orders": []
}

您是说您想要首先与字段“Id”匹配,然后进行比较。请参阅 vi 的屏幕截图

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