如何从两个JSON数组中获取delta?

时间:2015-01-16 14:17:18

标签: javascript jquery json

下面是两个JSON数组。我想获得delta数据(比较两个数据集和返回两个集合中没有出现的元素)。

var data1 = [
    { id: 1, name: "Normal" },
    { id: 2, name: "Admin" }
];
var data2 = [
    { id: 1, name: "Normal" },
    { id: 2, name: "Admin" },
    { id: 3, name: "HR" },
    { id: 4, name: "finance" }
];

预期产出:

var Result =  [
    { id: 3, name: "HR" },
    { id: 4, name: "finance" }
];

我试过这个,但没有运气:

$.grep(data2, function (el) { 
    if ($.inArray(el, data1) == -1) 
        diff.push([el, IDl]); 
});

1 个答案:

答案 0 :(得分:4)

你很接近,问题是你需要对你的对象进行深度比较。 inArray只会做一个浅浅的比较。以下代码将通过检查idname的相等性来进行深入比较。此外,它允许jQuery.grep构建结果数组,因此您无需手动执行此操作。

var data1 = [
    { id: 1, name: "Normal" },
    { id: 2, name: "Admin" }
];
var data2 = [
    { id: 1, name: "Normal" },
    { id: 2, name: "Admin" },
    { id: 3, name: "HR" },
    { id: 4, name: "finance" }
];

function compare(data1, data2) {
  return $.grep(data2, function(el) {
      return !data1.some(function(elToCompare) {
            return elToCompare.id === el.id && elToCompare.name === el.name;
        });
  });
}


$("#output").text(JSON.stringify(compare(data1, data2)));
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.10.1/jquery.min.js"></script>
<div id="output"></div>