¿Cómo puedo ordenar una matriz por cadena?
const filter = [ { index: "First" }, { index: "Second" }, { index: "Third" } ] const data = [ { title: 'Apple', index: "Second" }, { title: 'Samsung', index: "First" }, { title: 'BMW', index: "Third" }, { title: 'Apple', index: "Second" }, { title: 'Apple', index: "Second" }, { title: 'Samsung', index: "First" } ]Resultados previstos:
const data = [ { title: 'Samsung', index: "First" }, { title: 'Samsung', index: "First" }, { title: 'Apple', index: "Second" }, { title: 'Apple', index: "Second" }, { title: 'BMW', index: "Third" } ]¿Cómo iterar sobre dos matrices correctamente? ¿Tengo que iterar sobre dos matrices para hacer esto? ¿O hay otra forma de obtener el resultado deseado?
Dadas tres entradas: "Primero", "Segundo", "Tercero", ¿habrá más de estos índices?
Array#reduce , itere sobre el filter y guarde el atributo de index de cada objeto y su índice en la matriz en un MapArray#sort , ordene data por los valores de los atributos de index del mapa anterior const filter = [ { index: "First" }, { index: "Second" }, { index: "Third" } ], data = [ { title: 'Apple', index: "Second" }, { title: 'Samsung', index: "First" }, { title: 'BMW', index: "Third" }, { title: 'Apple', index: "Second" }, { title: 'Apple', index: "Second" }, { title: 'Samsung', index: "First" } ]; const indexSortMap = filter.reduce((map, { index }, i) => map.set(index, i), new Map); data.sort(({ index: a }, { index: b }) => indexSortMap.get(a) - indexSortMap.get(b)); console.log(data);Use Array#sort con función de comparación personalizada y Array#findIndex con función de devolución de llamada personalizada
const filter = [ { index: "First",}, {index: "Second",}, {index: "Third",}]; const data = [ { title: 'Apple', index: "Second" }, { title: 'Samsung', index: "First" }, { title: 'BMW', index: "Third" }, { title: 'Apple', index: "Second" }, { title: 'Apple', index: "Second" }, { title: 'Samsung', index: "First" } ]; data.sort((a ,b) => { return filter.findIndex(i => i.index === a.index) - filter.findIndex(i => i.index === b.index); }); console.log(data);Una posible solución (y simple) es iterar estas dos matrices. Serán empujados de acuerdo con el orden de la matriz de "filtro":
const sortedArray = [] filter.forEach(fil=> { data.forEach(dat=>{ if(dat.index===fil.index) sortedArray.push(dat) }) }) console.log(sortedArray)