Estoy tratando de ordenar las claves de un objeto de acuerdo con tres condiciones, primero teniendo la palabra Current y luego Conv y finalmente Traffic , pero no quiero que ninguna condición deshaga la anterior.
const obj = { 'Additional Traffic': 2, 'Current Conv': 1, 'Additional Conv': 0.5, 'Current Rev': 100, 'Additional Rev': 50 } const res = Object.keys(obj).sort((a, b) => a.includes('Current') && a.includes('Conv') ? -1 : 0) // Expected output // Current Conv // Current Rev // Additional Traffic // Additional Conv // Additional Rev console.log(res)Dado que la segunda palabra no está ordenada alfabéticamente, sugiero crear un sortHash para dar valor numérico a las palabras.
Esto se puede mejorar usando solo la letra inicial y agregando más reglas.
también confío en que son solo 2 palabras ... se puede mejorar para manejar más palabras en la lógica
const [wordA1, wordA2, wordA3, wordA4 /*...*/] = a.split(' ')
Código
const obj = {'Additional Traffic': 2,'Current Conv': 1,'Additional Conv': 0.5,'Current Rev': 100,'Additional Rev': 50,} const sortHash = { word1: { Current: 0, Additional: 1, }, word2: { Traffic: 0, Conv: 1, Rev: 2, }, } const res = Object.keys(obj).sort((a, b) => { const [wordA1, wordA2] = a.split(' ') const [wordB1, wordB2] = b.split(' ') return ( sortHash.word1[wordA1] - sortHash.word1[wordB1] || sortHash.word2[wordA2] - sortHash.word2[wordB2] ) }) console.log(res) const obj = { 'Additional Traffic': 2, 'Current Conv': 1, 'Additional Conv': 0.5, 'Current Rev': 100, 'Additional Rev': 50 } const data = Object.keys(obj).sort((key1, key2) => { const key1ContainsCurrent = key1.includes('Current'); const key2ContainsCurrent = key2.includes('Current'); const key1ContainsConv = key1.includes('Conv'); const key2ContainsConv= key2.includes('Conv'); debugger; if (key1ContainsCurrent || ((!key1ContainsCurrent && !key2ContainsCurrent) && key1ContainsConv)) { return -1 } if (key2ContainsCurrent || key2ContainsConv) { return 1 } return 0; }); console.log(data);por lo general, tendría una función que compara usando el primer criterio y si el resultado es 0 (igualdad), compara con el siguiente criterio.
Así que para ti eso sería:
const obj = { 'Additional Traffic': 2, 'Current Conv': 1, 'Additional Conv': 0.5, 'Current Rev': 100, 'Additional Rev': 50 } const res = Object.keys(obj).sort((a, b) => { let result = b.indexOf('Current') - a.indexOf('Current'); if (result === 0) { result = b.indexOf('Conv') - a.indexOf('Conv'); } return result; }); // Expected output // Current Conv // Current Rev // Additional Traffic <-- need one more rule for this one to be sorted properly // Additional Conv // Additional Rev console.log(res)Tenga en cuenta que si tiene muchas palabras para verificar, puede usar una matriz como esta:
const obj = { 'Additional Traffic': 2, 'Current Conv': 1, 'Additional Conv': 0.5, 'Current Rev': 100, 'Additional Rev': 50 } const SORT_ARRAY = ['Current', 'Traffic', 'Conv']; const res = Object.keys(obj).sort((a, b) => { let sortCriteriaIdx = 0; let result = 0; while (result === 0 && sortCriteriaIdx < SORT_ARRAY.length) { const criteria = SORT_ARRAY[sortCriteriaIdx]; result = b.indexOf(criteria) - a.indexOf(criteria); sortCriteriaIdx++; } return result; }); // Expected output // Current Conv // Current Rev // Additional Traffic // Additional Conv // Additional Rev console.log(res)