How do I use the jsondiffpatch library?

Asked

Viewed 277 times

11

I’m having doubts about how to manipulate the data with the library jsondiffpatch

The array 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}
]

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 answer from the library is:

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

It shows the right difference. My question is: Based on this difference, how do I manipulate this array to become 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}
]

2 answers

1

According to the library documentation just use the function patch that 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

  • I think it is not that result that he wants, note that in the question the desired exit has -2 for cheese (which is the difference between the original and the modified quantity).

  • Com base nessa diferença, como manipulo esse array para virar um novo?. I understood that he wanted to join the difference with the old array... But to do this you said just parse the diff and treat as he wants.

  • Yes, that’s what I think (see the last code block of the question);

  • Ah! Now I think I understand. But one thing doesn’t make sense. If the result will be only the difference of the values then the prices would have to be correct zero?! Because the result seems to be the variation of the values

0

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

I think you can get the result you are waiting with a "filter" to generate differences between numbers like this. 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);

the result in delta and:

{
  "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
  ]
}

Logically 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 about these filters (plugins): https://github.com/benjamine/jsondiffpatch/blob/master/docs/plugins.md

Browser other questions tagged

You are not signed in. Login or sign up in order to post.