Este es el requisito opuesto a lodash único basado en el atributo , aquí quiero hacer que la matriz sea única ignorando uno (o más) atributos.
Entonces, a continuación, no me importa el atributo 'edad' (tal vez hay varios registros, y solo quiero mantener donde cambian los detalles).
const arr = [{ "id": 1, "name": "Jen", "age": 31, "eyecolor": "blue", "hair": "brown", }, { "id": 1, "name": "Jen", "age": 32, "eyecolor": "blue", "hair": "brown" }, { "id": 2, "name": "Jules", "age": 31, "eyecolor": "blue", "hair": "brown" }, { "id": 2 "name": "Brian", "age": 40, "eyecolor": "blue", "hair": "brown" }]; const unique = _.uniqBy(arr, 'id'); console.log(unique); // const uniqueNot = _.uniqExcept(arr, 'age'); // keeps one of the Jen objects, but both of the Jules/Brian objects <script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.17.4/lodash.js"></script>Quiero lo anterior, como dice el comentario, para mantener uno de los objetos Jen, pero ambos objetos Jules/Brian.
Creo que puedo hacer esto así:
const arr = [{ "id": 1, "name": "Jen", "age": 31, "eyecolor": "blue", "hair": "brown", }, { "id": 1, "name": "Jen", "age": 32, "eyecolor": "blue", "hair": "brown" }, { "id": 2, "name": "Jules", "age": 31, "eyecolor": "blue", "hair": "brown" }, { "id": 2, "name": "Brian", "age": 40, "eyecolor": "blue", "hair": "brown" }]; const omissionComparator = (withoutKeys) => (a, b) => _.isEqual(_.omit(a, withoutKeys), _.omit(b, withoutKeys)) const uniqueWithoutAge = _.uniqWith(_.orderBy(arr, ['id','age'], ['asc', 'desc']), omissionComparator('age')); console.log(uniqueWithoutAge); <script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.17.4/lodash.js"></script>Pero, ¿hay alguna manera de hacer esto sin un comparador personalizado y/o sin tener que ordenar la matriz primero?
¿Tal vez esto? uniqBy + omitir + JSON.stringify
const arr = [{ "id": 1, "name": "Jen", "age": 31, "eyecolor": "blue", "hair": "brown", }, { "id": 1, "name": "Jen", "age": 32, "eyecolor": "blue", "hair": "brown" }, { "id": 2, "name": "Jules", "age": 31, "eyecolor": "blue", "hair": "brown" }, { "id": 2, "name": "Brian", "age": 40, "eyecolor": "blue", "hair": "brown" }]; const keysToIgore = ['age']; const result = _.uniqBy(arr, o => JSON.stringify(_.omit(o, keysToIgore))); console.log(result); <script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.17.4/lodash.js"></script>