# Compare duas listas com DIFFARR: o que adicionar, atualizar e remover

> Use DIFFARR() para comparar os elementos guardados na base de dados com os de um formulário e obter os que é preciso adicionar, atualizar e remover.

Framework: total5
Product: Total.js 5 (total5@0.0.19)
Language: pt
Content-SHA256: 0b07046d4786f74227f754d1706c258518684e1cb8e2ccd884c33099c5b5a57a
Snapshot: c0700e321579725c5cf4f5ace1ad7d2866d1b4f93c24a63c0b41b6b7998e976c
Sources: total5-installed@total5@0.0.19
Review: not-recorded

`DIFFARR(property, saved, submitted)` compara dois arrays de objetos por uma propriedade e devolve um objeto com três listas:

- `add`: os objetos de `submitted` cuja propriedade **não** está em `saved`
- `upd`: para os objetos que estão em ambos, `{ db, form }` com o objeto guardado e o submetido
- `rem`: os **valores da propriedade** (não os objetos) dos elementos de `saved` que não estão em `submitted`

É o passo habitual ao guardar uma lista editável: o formulário envia a lista completa e precisa de saber o que foi criado, o que mudou e o que foi eliminado. Os valores são comparados com `==`, por isso `1` e `'1'` são o mesmo elemento.

```js controllers/lists.js
const saved = [
	{ id: 1, name: 'Book' },
	{ id: 2, name: 'Pen' },
	{ id: 3, name: 'Lamp' }
];

exports.install = function() {
	ROUTE('POST /sync/', sync);
};

function sync($) {
	const diff = DIFFARR('id', saved, $.body.items);
	$.json({
		add: diff.add,
		update: diff.upd.map(n => ({ id: n.db.id, from: n.db.name, to: n.form.name })),
		remove: diff.rem
	});
}
```
