11521 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;
  }
}
Modérateur
Gordon25 a écrit :
Bonjour Papi, ton souci semble résolvable.
J'essaierai ceci :


const list: string[] = {AAA: 'abc', BBB: 'def', CCC: 'ghi'};
const keyToSearch: string = 'BBB'; # from API in c# or JSP
const resultatDeLaListe: result = list[${ keyToSearch }];
console.log('retrouver clé par valeur', resultatDeLaListe);


Corda+

A priori, c'est le contraire qu'il cherche à faire: trouver une clé(keyToSearch??) à partir de sa valeur. Et c'est quoi ce code ou cette syntaxe?

Sur SO, je suis tombé sur cette question similaire: https://stackoverflow.com/questions/9907419/how-to-get-a-key-in-a-javascript-object-by-its-value

qui donne en reprenant la question posée: trouver BBB à partir de def en utilisant find()
const list = {AAA: 'abc', BBB: 'def', CCC: 'ghi'}

function getKeyByValue(object, value) {
  return Object.keys(object).find(key => object[key] === value);
}
console.log(getKeyByValue(list,"def"));// affiche BBB , ce que l'on cherche! 

Modifié par gcyrillus (04 May 2024 - 21:55)
Meilleure solution