javascript - 数组中对象之间的区别

标签 javascript reactjs underscore.js

我试图找出复杂数组中元素之间的区别。

我有如下数组列表:

[
    [{
        id: 123,
        list: [{
            name: "Vimal",
            status: "Pass"
        }, {
            name: "Selvam",
            status: "Pass"
        }]
    }],
    [{
        id: 124,
        list: [{
            name: "Vimal",
            status: "Pass"
        }, {
            name: "Selvam",
            status: "Fail"
        }, {
            name: "Raj",
            status: "Pass"
        }]
    }]
]

我想得到列表之间的区别如下:

[{
    id: 123,
    list: [{
        name: "Selvam",
        status: "Pass"
    }]
}, {
    id: 124,
    list: [{
        name: "Selvam",
        status: "Fail"
    }, {
        name: "Raj",
        status: "Pass"
    }]
}]

我想循环每个元素并与相邻元素进行比较,然后将差异存储到临时变量中。但这听起来太麻烦了。我只是想知道您对我如何改变看待这个问题的方式的看法。指针会更有帮助。否则,有没有什么库可以轻松解决这个问题?

编辑1: 请注意,列表的长度永远不会是 2。大小是动态的。比较应该发生在所有元素之间。

最佳答案

如果您想要不同,您需要两个对象的交点

对于您的情况,您首先需要知道有什么不同。然后您可以利用它并使用它来删除属性以了解对称差异

这是一个非常复杂的问题,因为比较数组的复杂度是 O(n2)。在我下面的例子中,我只是比较了 JSON 值。这对于您的问题很方便,但不建议用于更复杂的对象数组。

注意:我不知道您为什么选择在没有嵌套数组的情况下将对象包装在数组中?我删除了括号以简化逻辑。查看更改后的 JSON。您可以轻松地将其添加回需要的逻辑中。

var dataArr = getSampleData();
var intersectObj = findObjectIntersection(dataArr[0], dataArr[1], {});

document.body.innerHTML = '<pre>' + JSON.stringify(intersectObj, null, 4) + '</pre>';

// Iterate over all keys and find similar key-values.
function findObjectIntersection(obj1, obj2, obj3) {
  var keys1 = Object.keys(obj1); // Object 1 keys
  var keys2 = Object.keys(obj2); // Object 2 keys
  var keysL = keys1.length > keys2.length ? keys1 : keys2;
  var keysS = keysL === keys1 ? keys2 : keys1;
  var keysD = keysL.filter(function(key) {
    return keysS.indexOf(key) > -1;
  });
  for (var i = 0; i < keysD.length; i++) {
    var currKey = keysD[i];
    var val1 = obj1[currKey];
    var val2 = obj2[currKey];

    if (isValue(val1) && isValue(val2)) {
      if (val1 === val2) {
        obj3[currKey] = val1;
      }
    } else if (isArray(val1) && isArray(val2)) {
      obj3[currKey] = findArrayIntersectionSimple(val1, val2, []);
    }
  }
  return obj3;
}

// Only compare values by JSON.
function findArrayIntersectionSimple(arr1, arr2, arr3) {
  var arrL = arr1.length > arr2.length ? arr1 : arr2;
  var arrS = arrL === arr1 ? arr2 : arr1;
  for (var i = 0; i < arrL.length; i++) {
    for (var j = 0; j < arrS.length; j++) {
      var val1 = JSON.stringify(arrL[i]);
      var val2 = JSON.stringify(arrS[j]);
      if (val1 === val2) {
        arr3.push(arrL[i]);
      }
    }
  }
  return arr3;
}

function isFunction(obj) {
  return {}.toString.apply(obj) === '[object Function]';
}

function isArray(obj) {
  return {}.toString.apply(obj) === '[object Array]';
}

function isObject(obj) {
  return {}.toString.apply(obj) === '[object Object]';
}

function isValue(obj) {
  return !isObject(obj) && !isArray(obj);
}

function getSampleData() {
  return [{
    id: 123,
    list: [{
      name: "Vimal",
      status: "Pass"
    }, {
      name: "Selvam",
      status: "Pass"
    }]
  }, {
    id: 124,
    list: [{
      name: "Vimal",
      status: "Pass"
    }, {
      name: "Selvam",
      status: "Fail"
    }, {
      name: "Raj",
      status: "Pass"
    }]
  }];
}

关于javascript - 数组中对象之间的区别,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40676541/

相关文章:

javascript - ReactJS - 将 json 插入状态数组

javascript - react : why does the onclick get executed even without having clicked?

javascript - 查找一个数组中比另一个数组中的元素大的元素

javascript - 发电机 : How to append to list values in document

javascript - 如何将参数从 scala.html 传递到 play 框架中的 javascript?

reactjs - 测试 React Material-UI IconMenu。 Simulate.click 不工作

javascript - 在 underscore.js 中通过对象键查找

javascript - 在半圆内绘制点

javascript - Html:如何点击下载链接,而不是右键单击并另存为

javascript - 使用下划线获取属性值数组