在 Javascript / jQuery 中如何对关联数组执行“Diff”操作?

6
如果我有两个关联数组,那么对它们的值进行差异比较的最有效方法是什么?
例如,给定以下内容:
  array1 = {
    foreground: 'red',
    shape: 'circle',
    background: 'yellow'
  };

  array2 = {
    foreground: 'red',
    shape: 'square',
    angle: '90',
    background: 'yellow'
  };

如何比较两个数组,以便缺失或额外的项目是结果数组。在这种情况下,如果我想比较array1和array2,则会返回:

array3 = {shape: 'circle'}

如果我将array2与array1进行比较,它会返回:

array3 = {shape: 'square', angle: '90'}

感谢您的帮助!

以下是关于IT技术方面需要翻译的内容:

5个回答

7

试试这个:

function diff(obj1, obj2) {
    var result = {};
    $.each(obj1, function (key, value) {
        if (!obj2.hasOwnProperty(key) || obj2[key] !== obj1[key]) {
            result[key] = value;
        }
    });

    return result;
}

3

1

RaYell的解决方案很好,但不幸的是只会告诉你obj2中与obj1不同或不存在的项,如果我们需要知道双方,让我们获取所有键然后进行比较。以下函数将返回一个关联数组,其中包含每个对象的键值。哦...公平起见,我还没有测试过,但这应该可以工作。

var diff = function(obj1,obj2) {
  var newObj = $.extend({},obj1,obj2);
  var result = {};
  $.each(newObj, function (key, value) {
      if (!obj2.hasOwnProperty(key) || !obj1.hasOwnProperty(key) || obj2[key] !== obj1[key]) {
         result[key] = [obj1[key],obj2[key]];
      }
  });

  return result;
}

哦,虽然我承认第一个解决方案回答了最初的问题,但我认为上面的解决方案提供了另一种方法,初始用户可能会发现有用,以免需要检查两次。


0

我的代码是这样的:

function diff(obj1, obj2){

var result = {};

for(var key1 in obj1){

    let resposta =  {
        before : obj1[key1] ? obj1[key1] : '',
        after  : obj2[key1] ? obj2[key1] : ''
    };

    if(resposta.before !== resposta.after){

        result[key1] = resposta;
    }
}

for(var key2 in obj2){

    if(!(key2 in result) || (key2 in obj1)){

        let resposta = {
            before : obj1[key2] ? obj1[key2] : '', 
            after  : obj2[key2] ? obj2[key2] : ''
        }

        if(resposta.before !== resposta.after){

            result[key2] = resposta;
        }
    }
}

return (Object.assign({}, result));
}

0

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接