Tengo una matriz que solo tiene objetos y me gustaría eliminar los objetos duplicados en función de uno de sus valores clave, que es val.js.url pero quiero que el objeto restante sea el último entre los objetos duplicados, así que básicamente usé reverse() en mi código`.
Mi matriz:
[ { "id": "js_1oc3uiteki22", "tab": { "title": "title 1", "url": "http://google.com" }, "js": { "initiator": "https://google.com", "url": "http://url.com" } }, { "id": "js_1oc3uiteki22", "tab": { "title": "title 2", "url": "http://google2.com" }, "js": { "initiator": "https://google2.com", "url": "http://url.com" } } ]Resultado Esperado:
[ { "id": "js_1oc3uiteki22", "tab": { "title": "title 2", "url": "http://google2.com" }, "js": { "initiator": "https://google2.com", "url": "http://url.com" } } ]En realidad, tengo el siguiente código que resuelve este problema, pero cuando necesito usar ese código 2 veces en el mismo archivo js, supongo que es un poco conflictivo y no limpia bien los duplicados en la segunda matriz.
function dupfix(arr) { return arr.reverse().filter(val => { if (!this.hasOwnProperty(val.js.url)) { return this[val.js.url] = true } return false }, {}).reverse() } file = dupfix(file)Entonces, ¿cómo puedo arreglar ese código anterior o hay otros métodos mejores para hacerlo? Gracias.
Encontré esa realmente rápida entre otras alternativas, https://stackoverflow.com/a/61027136
function removeDuplicates(array, key) { let lookup = {}; array.forEach(element => { lookup[element[key]] = element }); return Object.keys(lookup).map(key => lookup[key]); }; removeDuplicates(array,'objectKey');Puede usar así para filtrar los duplicados.
const myArr=[ { "id": "js_1oc3uiteki22", "tab": { "title": "title 1", "url": "http://google.com" }, "js": { "initiator": "https://google.com", "url": "http://url.com" } }, { "id": "js_1oc3uiteki22", "tab": { "title": "title 2", "url": "http://google2.com" }, "js": { "initiator": "https://google2.com", "url": "http://url2.com" } }, { "id": "js_1oc3uiteki23", "tab": { "title": "title 3", "url": "http://google3.com" }, "js": { "initiator": "https://google3.com", "url": "http://url3.com" } }, { "id": "js_1oc3uiteki23", "tab": { "title": "title 4", "url": "http://google4.com" }, "js": { "initiator": "https://google4.com", "url": "http://url4.com" } } ] function removeDuplicates(arr) { let uniqueIds = []; var result = arr.slice().reverse().filter(item => { var isDuplicate = uniqueIds.includes(item.id); if (!isDuplicate) { uniqueIds.push(item.id); return item; } }); return result; } console.log(removeDuplicates(myArr));Puede usar la agrupación hash para identificar objetos de forma única:
const val = [{"id":"js_1oc3uiteki22","tab":{"title":"title 1","url":"http://google.com"},"js":{"initiator":"https://google.com","url":"http://url.com"}},{"id":"js_1oc3uiteki22","tab":{"title":"title 2","url":"http://google2.com"},"js":{"initiator":"https://google2.com","url":"http://url.com"}}]; const uniqs = val.reduce((r, item) => (r[item.js.url] = item, r), {}); const result = Object.values(uniqs); console.log(result); .as-console-wrapper { max-height: 100% !important; top: 0 }