Estoy luchando con alguna tarea en javascript. Tengo el siguiente objeto:

const methods = {
    searchRanking: {
        id: 'tmEM6RoEPmUO',
        template: 'main_template',
        startUrl: 'https://www.amazon.de/s?k={value}',
        startValueOverrideName: 'url',

        dataProcessor: function (data) {
            return data.map(/*doe shit met data*/)
        }
    },

    productDetails: {
        id: 'tAewRCbTuuL5',
        template: 'main_template',
        startUrl: 'https://www.amazon.de/dp/{value}',
        startValName: 'url',

        dataProcessor: function (data) {
            return data.map(/*doe shit met data*/)
        }
    }

}

Cada objeto tiene un método de procesador. Quiero devolver el procesador del objeto que contiene la identificación tmEM6RoEPmUO

Puedo recorrer las teclas y verificar cada clave si contiene la ID dada, pero parece una solución, ¿hay alguna manera más eficiente?

3
Kevin.a 30 oct. 2019 a las 13:25

3 respuestas

La mejor respuesta

Simplemente recorrería las teclas y comprobaría. En ese caso, la complejidad del tiempo será O(N). Será como

let res = Object.values(obj).find(x => x.id === 'tmEM6RoEPmUO').dataProcessor()

Pero considere que desea una complejidad de tiempo O(1), entonces puede crear otro objeto con claves iguales a la id del objeto.

let newObj = Object.fromEntries(Object.entries(obj).map(([_, v]) => [v.id, v]));
let res = newObj['tmEM6RoEPmUO'].dataProcessor() 
3
Maheer Ali 30 oct. 2019 a las 10:32

Puede extraer el objeto deseado en una constante, method e invocar su método dataProcessor con sus argumentos de la siguiente manera:

const method = Object.values(obj).find(o => o.id === 'tmEM6RoEPmUO');
method.dataProcessor(data);
0
psilocybin 30 oct. 2019 a las 11:02

Recorrer todas las claves en el objeto y verificar su id

for(let m of Object.keys(methods)){
 if(methods[m].id == "tmEM6RoEPmUO"){
  return methods[m].dataProcessor;
 }
}
-2
Vikram Singh 30 oct. 2019 a las 10:31