Tengo una matriz u objeto que servirá como columnas para una tabla con una clave única
const list = [{ key: "Name", textColor: "red" },{ key: "Age", textColor: "green" },{ key: "Occupation", textColor: "yellow" }]Y tengo una lista de ordenamiento de columnas en la tabla.
const newOrder = ["Occupation", "Name", "Age"] Ahora, ¿cómo puedo reorganizar la lista de acuerdo con el nuevo orden sin usar nested loops ? Además, todos estos son dinámicos, por lo que no se trata solo de las tres columnas mencionadas anteriormente
Rendimiento esperado
const list = [{ key: "Occupation", textColor: "yellow" },{ key: "Name", textColor: "red" },{ key: "Age", textColor: "green" }]Puedes usar solo ordenación regular
const list = [{key: "Name",textColor: "red"},{key: "Age",textColor: "green"},{key: "Occupation",textColor: "yellow"}]; const newOrder = ["Occupation", "Name", "Age"]; const result = list.sort(({key: a}, {key: b}) => newOrder.indexOf(a) - newOrder.indexOf(b)); console.log(result); .as-console-wrapper{min-height: 100%!important; top: 0}Su lista se puede reformatear a un objeto javascript normal en el que la key es el nombre de la propiedad y textColor es el valor:
const toObject = kvps => Object.fromEntries(kvps.map(kvp => [ kvp.key, kvp.textColor ]));Con una matriz dada de claves, puede elegir valores de ese objeto de la siguiente manera:
const fromObject = (order, obj) => order.map(key => ({ key, textColor: obj[key] }));Encadene los dos y podrá reordenar cualquier lista de pares de valores clave:
const list = [{ key: "Name", textColor: "red" },{ key: "Age", textColor: "green" },{ key: "Occupation", textColor: "yellow" }] const toObject = kvps => Object.fromEntries(kvps.map(kvp => [ kvp.key, kvp.textColor ])); const fromObject = (order, obj) => order.map(key => ({ key, textColor: obj[key] })); const reorder = (order, kvps) => fromObject(order, toObject(kvps)); const newList = reorder(["Occupation", "Name", "Age"], list); console.log( newList )Editar: si los tamaños de su lista y las matrices de pedidos son pequeños, probablemente desee optar por el enfoque mucho más fácil de leer sugerido por Jon Webb en una de las otras respuestas. 🙂 Traté de mantener mi solución en una complejidad O(n + m) en lugar de O(n * m), (n = tamaño de la lista, m = tamaño del pedido) pero probablemente no valga la pena la complejidad adicional.
Puede iterar en la lista de "pedidos", encontrar el elemento correspondiente en la lista original y enviar el elemento a la nueva lista en ese orden:
const orderList = (list, order) => { const newList = []; for (key of order) { const item = list.find((obj) => obj.key == key); if (item) newList.push(item); } return newList; }