store = [{ "item": "shirt", "price": 20 }, { "item": "shirt", "price": 50 }, { "item": "pants", "price": 10 }, { "item": "pants", "price": 20 } ] //im filtering the array to get objects without duplication here console.log(store.filter((v, i, a) => a.findIndex(v2 => ['item'].every(k => v2[k] === v[k])) === i))y también me gustaría obtener el precio máximo en el mismo filtro, entonces, ¿cómo obtendría este resultado después de ejecutarlo?
Rendimiento esperado:
[{ "item": "shirt", "price": 50 }, { "item": "pants", "price": 20 }]Puede sort() por precio antes de filtrar.
store = [{ "item": "shirt", "price": 20 }, { "item": "shirt", "price": 50 }, { "item": "pants", "price": 10 }, { "item": "pants", "price": 20 } ] const result = store.sort((a, b) => b.price - a.price).filter((v, i, a) => a.findIndex(v2 => ['item'].every(k => v2[k] === v[k])) === i); console.log(result);Me gusta la respuesta de @axtck. .... Después de haber filtrado los objetos, ahora use .map() para encontrar a partir de los datos originales el precio máximo ordenando:
.map( ({item,price}) => ({item,price:store.filter(p => p.item === item).sort((a,b) => b.price - a.price)[0].price}) ) store = [{ "item": "shirt", "price": 20 }, { "item": "shirt", "price": 50 }, { "item": "pants", "price": 10 }, { "item": "pants", "price": 20 } ] //im filtering the array to get objects without duplication here console.log( store.filter((v, i, a) => a.findIndex(v2 => ['item'].every(k => v2[k] === v[k])) === i) .map( ({item,price}) => ({item,price:store.filter(p => p.item === item).sort((a,b) => b.price - a.price)[0].price}) ) )Puede usar Array.reduce() para obtener el precio más alto para cada artículo.
Enumeraríamos a través de cada valor, creando un objeto de mapa, y si no existe ninguna entrada para ese artículo o la entrada existente tiene un precio más bajo, actualizaríamos:
const store = [{ "item": "shirt", "price": 20 }, { "item": "shirt", "price": 50 }, { "item": "pants", "price": 10 }, { "item": "pants", "price": 20 } ] const result = Object.values(store.reduce((acc, { item, price }) => { // Either item does not exist or has a lower price... if (!acc[item] || acc[item].price < price) { acc[item] = { item, price }; } return acc; }, {})) console.log(result) .as-console-wrapper { max-height: 100% !important; }