11488 sujets

JavaScript, DOM et API Web HTML5

Bonjour à tous

Je n'arrive pas à trouver comment faire simplement la chose suivante :
J'ai un objet du type :

const list = {AAA: 'abc', BBB: 'def', CCC: 'ghi'}

Je cherche à faire une fonction findKey telle que findKey('def') -> 'BBB'
autrement bien sûr qu'en parcourant list jusqu'à trouver la bonne entrée.
J'ai essayé la fonction findIndex mais elle ne semble marcher que sur des array pas sur des objets.

Merci de votre aide
Modifié par PapyJP (20 Apr 2024 - 11:54)
Modérateur
Salut,

Tu veux le faire d'une manière élégante ?

(()=>{
    let list = {AAA: 'abc', BBB: 'def', CCC: 'ghi'},
        [key, value] = Object.entries(list).find(([k, v], i)=> v === 'abc')
    console.log('>', list[key], key)
})()

Tu veux quelques chose de plus performant ?

(()=>{
    let output = {},
        list = {AAA: 'abc', BBB: 'def', CCC: 'ghi'}
    for(let k in list){
        if(list[k] === 'abc'){
            output[k] = list[k]
            break
        }
    }
    console.log(output)
})()


Si tu souhaites en faire une méthode
Ancienne manière de faire :

(()=>{
    let list = {AAA: 'abc', BBB: 'def', CCC: 'ghi'}
    Object.prototype.findKey = function(value){
        return Object.entries(this).find(([k, v]) => v === value).shift()
    }
    let x = list.findKey('abc')
    console.log(x)
})()


Manière plus actuelle:

(()=>{
    let list = {AAA: 'abc', BBB: 'def', CCC: 'ghi'}
    Object.assign(Object.prototype, {
        findKey(value){
            return Object.entries(this).find(([k, v]) => v === value).shift()
        }
    });
    let x = list.findKey('def')
    console.log(x)
})()


ps: bof bof const ! Aucun intérêt de le placer sur un objet scalaire (qu'est ce qu'un objet et qu'est ce qu'une constante ?). Ce n'est qu'un avis personnel, mais le nom list n'est peut-être pas si approprié
Modifié par niuxe (20 Apr 2024 - 17:04)
Après essais, ça me semble un moyen compliqué de masquer une recherche par balayage de la table.
Je vais rester à mon code actuel :

function searchInList(list, text) {
  for(const [key, value] of Object.entries(list)) {
    if(value == text) return key;
  }
}