Делаете "Diff" на ассоциативном массиве в javascript / jQuery? - PullRequest
6 голосов
/ 01 апреля 2010

Если бы у меня было два ассоциативных массива, каков был бы наиболее эффективный способ проведения сравнения с их значениями?

Например, дано:

  array1 = {
    foreground: 'red',
    shape: 'circle',
    background: 'yellow'
  };

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

Как бы проверить одно против другого, чтобы элементы отсутствовали или дополнительные были результирующим массивом В этом случае, если бы я хотел сравнить массив1 в массиве2, он бы возвратил:

array3 = {shape: 'circle'}

Если бы я сравнил массив2 в массиве1, он вернул бы:

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

Заранее спасибо за помощь!

Ответы [ 5 ]

7 голосов
/ 01 апреля 2010

Попробуйте это:

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 голосов
/ 01 апреля 2010

Если вы знакомы с синтаксисом PHP, взгляните на http://phpjs.org/functions/index, который включает почти все функции PHP, связанные с массивами, преобразованные в JavaScript - включая array_diff

1 голос
/ 30 июня 2011

Решение 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 голосов
/ 02 августа 2018

Минха фикус ассим:

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 голосов
/ 02 марта 2014

Это может быть намного сложнее, чем вам нужно, но вы можете попробовать мою библиотеку jsondiffpatch, которая будет различать любую пару объектов javascript:

https://github.com/benjamine/jsondiffpatch

Если вы хотите проверить это, вы можете увидеть его вживую в http://benjamine.github.com/jsondiffpatch/demo/index.html

...