How to use the jsondiffpatch library?

11

I'm having second thoughts about manipulating the data with the jsondiffpatch library

The original array :

[
  {"id":1004,"idproduto":3,"forma":"Alface","preco":1,"quantidade":1},
  {"id":1000,"idproduto":3,"forma":"Bacon","preco":2,"quantidade":1},
  {"id":1001,"idproduto":3,"forma":"Queijo Cheedar","preco":2,"quantidade":3}
]

The array modified:

[
  {"id":1004,"idproduto":3,"forma":"Alface","preco":1,"quantidade":2},
  {"id":1001,"idproduto":3,"forma":"Queijo Cheedar","preco":2,"quantidade":1},
  {"id":1002,"idproduto":2,"forma":"Bacon","preco":2,"quantidade":1}
]

The library's response is:

[0: {
quantidade: [1,2]
},1: {
quantidade: [3,1]
},2{
  "id": 1002,
  "idproduto": 2,
  "forma": "Bacon",
  "preco": 2,
  "quantidade": 1
}]

It displays the right difference. My question is: Based on this difference, how do I manipulate this array to turn a new ??

As follows:

[
  {"id":1004,"idproduto":3,"forma":"Alface","preco":1,"quantidade":1},
  {"id":1001,"idproduto":3,"forma":"Queijo Cheedar","preco":2,"quantidade":-2},
  {"id":1002,"idproduto":2,"forma":"Bacon","preco":2,"quantidade":1}
]
    
asked by anonymous 05.03.2015 / 18:02

2 answers

1

According to the library documentation, only use the patch function that already comes with the library.

Ex:

var original = [
    {"id":1004,"idproduto":3,"forma":"Alface","preco":1,"quantidade":1},
    {"id":1000,"idproduto":3,"forma":"Bacon","preco":2,"quantidade":1},
    {"id":1001,"idproduto":3,"forma":"Queijo Cheedar","preco":2,"quantidade":3}
];

var modificado = [
    {"id":1004,"idproduto":3,"forma":"Alface","preco":1,"quantidade":2},
    {"id":1001,"idproduto":3,"forma":"Queijo Cheedar","preco":2,"quantidade":1},
    {"id":1002,"idproduto":2,"forma":"Bacon","preco":2,"quantidade":1}
];

var diferenca = jsondiffpatch.diff(original, modificado);

// modifica o original
jsondiffpatch.patch(original, diferenca);

console.log(original);

I edited Fiddle to patch the library. Fiddle

EDIT : I modified the code and added Fiddle

    
11.03.2015 / 23:04
0

(Disclaimer: I am the author of jsondiffpatch, and my Portuguese is not the best :))

I think you can get the result you're expecting with a "filter" to generate differences between numbers like that. the code:

var diffpatcher = jsondiffpatch.create({
  objectHash: function(obj) {
    return obj.id; // esse e o jeito de identificar objectos no seu array mesmo tendo mudado de posiçao
  }
});

var numericDiffFilter = function(context) {
  if (typeof context.left === 'number' && typeof context.right === 'number' && context.left !== context.right) {
    // dois numeros, deixar so a diferença (em lugar do array com os dois valores)
    context.setResult(context.right - context.left).exit();
  }
};
// a filterName is useful if I want to allow other filters to be inserted before/after this one
numericDiffFilter.filterName = 'numeric';

// inserir o novo filtro antes do "trivial" o primeiro quando se comparam dois valores
diffpatcher.processor.pipes.diff.before('trivial', numericDiffFilter);

// os valores que vc botou (eu corregi o id do Bacon que parece foi um typo):
var l = [
  {"id":1004,"idproduto":3,"forma":"Alface","preco":1,"quantidade":1},
  {"id":1000,"idproduto":3,"forma":"Bacon","preco":2,"quantidade":1},
  {"id":1001,"idproduto":3,"forma":"Queijo Cheedar","preco":2,"quantidade":3}
];
var r = [
  {"id":1004,"idproduto":3,"forma":"Alface","preco":1,"quantidade":2},
  {"id":1001,"idproduto":3,"forma":"Queijo Cheedar","preco":2,"quantidade":1},
  {"id":1000,"idproduto":2,"forma":"Bacon","preco":2,"quantidade":1}
];

var delta = diffpatcher.diff(l, r);

result in delta e:

{
  "0": {
    "quantidade": 1
  },
  "1": {
    "quantidade": -2
  },
  // o idproduto do Bacon diminiu (typo?)
  "2": {
    "idproduto": -1
  },
  "_t": "a",
  // o Queijo moveu da posicao 2 a posicao 1
  "_2": [
    "",
    1,
    3
  ]
}

Of course now this delta can no longer be used with .patch() but I think this is expected in this case (but this can be solved by writing a patch filter).

Documentation on these filters (plugins): link

    
04.10.2015 / 02:35