Tengo una gran BST de objetos (más de 200k) y necesito agruparlos por su nombre en uno solo que combine las existencias y tome el promedio de costos en consecuencia. Si el stock llega a menos o igual a cero, también necesito eliminarlo del BST. Una muestra de la entrada es
let x = [ { name: 'Shoes of Negligible Looks', stock: -7, cost: '$52.81' }, { name: 'Pants of Profound Intelligence', stock: 4, cost: '$26.07' }, { name: 'Cape of Flaming Reputation', stock: 9, cost: '$87.81' }, { name: 'Cape of Flaming Reputation', stock: 9, cost: '$87.81' }, { name: 'Wand of Profound Reputation', stock: 17, cost: '$89.14' }, { name: 'Cape of Icy Intelligence', stock: 15, cost: '$44.68' }, { name: 'Pants of Negligible Distraction', stock: 28, cost: '$16.91' }, { name: 'Ring of Profound Cunning', stock: 5, cost: '$88.25' }, ]En esta muestra necesitaría combinar el Cabo de Reputación Llameante.
Este es el método de comparación que estoy usando para comparar los valores de los nodos en mi BST:
const comparatorFunction = (a, b) => String(a).localeCompare(String(b));Y creo el nuevo BST y relleno la matriz de esta manera:
let bst = new BST(comparatorFunction); for (let i = 0; i < x.length; i++) { bst.add(x[i]); }Luego ordénelo en orden de esta manera (supongo que esto podría ser útil al agrupar):
let inOrderList = bst.inOrder();Gracias de antemano a cualquiera que intente esta larga solución.
Puede que me esté perdiendo algo, pero así es como lo hice con la ayuda de algunas funciones JS integradas; de lo contrario, es posible que desee compartir cómo se ve su implementación de BST.
function getUnique(arr) { // Getting unique items by name const newArr = Array.from(new Set(arr.map(x => x.name))) .sort((a, b) => { // Ascending sort return String(a).localeCompare(String(b));; }); return newArr.map(x => { return arr.find(v => v.name === x); }) // Filtering by stock! .filter(x => x.stock > 0); } const x = [ { name: 'Shoes of Negligible Looks', stock: -7, cost: '$52.81' }, { name: 'Pants of Profound Intelligence', stock: 4, cost: '$26.07' }, { name: 'Cape of Flaming Reputation', stock: 9, cost: '$87.81' }, { name: 'Cape of Flaming Reputation', stock: 9, cost: '$87.81' }, { name: 'Wand of Profound Reputation', stock: 17, cost: '$89.14' }, { name: 'Cape of Icy Intelligence', stock: 15, cost: '$44.68' }, { name: 'Pants of Negligible Distraction', stock: 28, cost: '$16.91' }, { name: 'Ring of Profound Cunning', stock: 5, cost: '$88.25' }, ]; console.log(getUnique(x));