initialArray = [ obj1, obj2, obj3, obj4, obj5, obj6, obj7, obj8 ]; // all eight are uniq objects filterdArray = [ obj2, obj5, obj6, obj8 ]; // varies from 0 to 8 varOrder = [ 6, 8, 3, 2, 1, 4, 5, 7 ]Tengo un varOrder como entrada, que es del 1 al 8. Siempre es del 1 al 8 pero en un orden diferente según el deseo del usuario.
Inicialmente el Array tiene Obj1 a Obj8, pero después del filtro, el Array puede o no tener elementos, si tiene elementos, varía de 1 a 8.
lo que busco es si
filterdArray = [ obj2, obj5, obj6, obj8 ]; // and my varOrder is varOrder = [ 6, 8, 3, 2, 1, 4, 5, 7 ]; // required ouput is like below FinalObjects = [ obj6, obj8, obj2, obj5 ]En simple, de 8 en el orden dado por el usuario, si algunos objetos no están disponibles, salte al siguiente objeto.
El razonamiento para FinalObjects = [ obj6, obj8, obj2, obj5 ] es
varOrder | FilteredArray 6 | obj6 available from FilterdArray (obj6) 8 | obj8 available from FilteredArray (obj8) 3 | obj3 is not available from FilteredArray 2 | obj2 is available from FilteredArray (obj2) 1 | obj1 is not available from FilteredArray 4 | obj4 is not available from FilteredArray 5 | obj5 is available from FilteredArray (obj5) 7 | obj7 is not availabe from FilteredArray Por lo tanto FinalObjects = [ obj6, obj8, obj2, obj5 ]
Primero realice el mapeo, luego filtre.
const varOrder = [ 6, 8, 3, 2, 1, 4, 5, 7 ]; const initialArray = [ obj1, obj2, obj3, obj4, obj5, obj6, obj7, obj8 ]; const orderedArray = varOrder.map((idx) => initialArray[idx - 1]); // [ obj6, obj8, obj3, obj2, obj1, obj4, obj5, obj7 ] const filteredArray = orderedArray.filter(obj => obj !== null); // Assume all objects are null except for 6, 8, 2, and 5. // [ obj6, obj8, obj2, obj5 ]Puede utilizar este enfoque:
Primero, asignamos cada elemento de filterdArray a un índice de order , ya que esta es una operación costosa y no queremos ejecutarla cada vez que reorganizamos la matriz.
Luego ordenamos la matriz mapped por el índice de order .
Finalmente, devolvemos los objetos originales.
const initialArray = [{n:'obj1'}, {n:'obj2'}, {n:'obj3'}, {n:'obj4'}, {n:'obj5'}, {n:'obj6'}, {n:'obj7'}, {n:'obj8'}]; const filterdArray = [{n:'obj2'}, {n:'obj5'}, {n:'obj6'}, {n:'obj8'}]; const order = [ 6, 8, 3, 2, 1, 4, 5, 7 ]; const mapped = filterdArray.map((obj) => ( { obj, order: order.at(initialArray.findIndex((item)=> item.n === obj.n)) })); console.log('mapped >>', mapped); const sortedByOrder = mapped .sort((o1, o2) => o1.order - o2.order) .map(({obj}) => obj); console.log('sortedByOrder >>', sortedByOrder); .as-console-wrapper {max-height: 100% !important; top: 0}Espero que este sea el resultado esperado. acaba de usar un bucle for
let obj1 = {name: 'obj1'};let obj2 = {name: 'obj2'};let obj3 = {name: 'obj3'};let obj4 = {name: 'obj4'};let obj5 = {name: 'obj5'};let obj6 = {name: 'obj6'};let obj7 = {name: 'obj7'};let obj8 = {name: 'obj8'} initialArray = [ obj1, obj2, obj3, obj4, obj5, obj6, obj7, obj8 ]; // all eight are uniq objects filterdArray = [ obj2, obj5, obj6, obj8 ]; // varies from 0 to 8 varOrder1 = [ 6, 3, 8, 2, 1, 4, 5, 7 ]; varOrder2 = [ 7, 5, 4, 1, 2, 8, 3, 6 ]; let finalArr1 = []; let finalArr2 = []; const sorter = (varOrder) => { let finalArr = [] for (let i = 0; i < varOrder.length; i++) { if (filterdArray.includes(initialArray[varOrder[i]-1])){ finalArr.push(initialArray[varOrder[i]-1]) } } return finalArr; } console.log(sorter(varOrder1)) console.log(sorter(varOrder2)) .as-console-wrapper { max-height: 100% !important; top: 0; }