# Compara dos listas con DIFFARR: qué añadir, actualizar y eliminar

> Usa DIFFARR() para comparar los elementos guardados en la base de datos con los de un formulario y obtener los que hay que añadir, actualizar y eliminar.

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

`DIFFARR(property, saved, submitted)` compara dos arrays de objetos por una propiedad y devuelve un objeto con tres listas:

- `add`: los objetos de `submitted` cuya propiedad **no** está en `saved`
- `upd`: para los objetos que están en ambos, `{ db, form }` con el objeto guardado y el enviado
- `rem`: los **valores de la propiedad** (no los objetos) de los elementos de `saved` que no están en `submitted`

Es el paso habitual al guardar una lista editable: el formulario envía la lista completa y necesitas saber qué se creó, qué cambió y qué se eliminó. Los valores se comparan con `==`, así que `1` y `'1'` son el mismo 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
	});
}
```
