1
votes

Comment rechercher une valeur dans Object qui a également des valeurs dans le tableau?

J'ai un objet comme ci-dessous;

FOO: {
        BAR: [9,32,8,12 ],
        ZET: 4,
        BETA: [3,14,6,2],
        ALPHA: 37
    },

J'ai besoin de rechercher les valeurs de cet objet pour faire correspondre les valeurs avec les clés . Il y a des tonnes d'échantillons qui donnent des clés avec une valeur singulière mais je n'ai pas trouvé d'échantillon capable de rechercher également dans les valeurs qui sont dans des tableaux.

Comment puis-je être capable de rechercher l'ensemble de ces valeurs de l'objet FOO et de les faire correspondre avec les keys?

Remarque : Le but; Je vais chercher une entrée et si l'entrée donnée est 2 alors attendez-vous à obtenir la clé BETA ou si l'entrée donnée est 4 alors ZET .

Donc, fondamentalement, les valeurs seront déjà des valeurs uniques prédéfinies.


7 commentaires

veuillez ajouter la valeur que vous recherchez, le résultat et ce que vous avez essayé.


Je vais fournir des valeurs qui dépendent de différentes entrées. Donc, si l'entrée donnée est 2 , attendez-vous à obtenir la clé BETA ou si l'entrée donnée est 4 alors ZET ...


Que faire si une valeur existe à la fois en tant qu'indépendant et en tableau?


@MohammadUsman J'ai mis à jour le message et il n'y aura pas de valeurs en double.


Ces numéros sont-ils uniques dans FOO ? Un nombre peut-il être dans plus d'un tableau?


@Dmitry no. ils seront uniques comme je l'ai noté dans le post.


Voulez-vous essentiellement traiter le tout comme un seul tableau de valeurs?


6 Réponses :


1
votes

Quelque chose de ce genre devrait fonctionner:

// What we're searching
FOO = {
        BAR: [9,32,8,12 ],
        ZET: 4,
        BETA: [3,14,6,2],
        ALPHA: 37
    };


function findValue(findValue, obj) {
    return Object.entries(FOO)
    .filter(([key,value]) => value === findValue || Array.isArray(value) && value.includes(findValue))
    .map(([key,value])=> key);
}

function testfindValue(value, obj) {
    console.log("testfindValue: \nInput: " + value, "Result: ", findValue(value,obj));
}

testfindValue(4, FOO);
testfindValue(6, FOO);
testfindValue(32, FOO);
testfindValue(99, FOO);


2 commentaires

Cher @TerryLennox, votre extrait fonctionne parfaitement, mais je vais quand même utiliser la solution de @MohammedUsman pendant que je dois définir quel obj. devrait être considéré dans l'instruction de retour de findValue mais la solution d'Usman peut fonctionner avec n'importe quel obj. Alors merci pour vos efforts.


Super, heureux de voir que vous avez une solution!



4
votes

Vous pouvez le faire avec une simple boucle for ... in et les méthodes .concAT () et .includes () de tableaux :

let obj = {
  BAR: [9,32,8,12 ],
  ZET: 4,
  BETA: [3,14,6,2],
  ALPHA: 37
};

let locator = (o, v) => {
  for (var prop in o) {
    if([].concat(o[prop]).includes(v)){
      return prop;
    }
  }
}

console.log(locator(obj, 2));
console.log(locator(obj, 4));


1 commentaires

Cher @MohammadUsman, merci pour la solution et elle a une très bonne utilisation avec tous les obj globaux. Cela a si bien fonctionné pour mon objectif.



1
votes

Vous pouvez simplement parcourir l'objet en boucle et rechercher la valeur pour identifier la clé. Si plusieurs correspondances sont trouvées, un tableau de clés correspondant au résultat sera renvoyé.

function objSearch(key, obj) {
  const keys = [];
  for (let item in obj) {
    if (obj.hasOwnProperty(item)) {
      if (obj[item] === key || (Array.isArray(obj[item]) && obj[item].indexOf(key) > -1)) {
        keys.push(item);
      }
    }
  }
  return keys;
}

const obj = {
  FOO: {
    BAR: [9, 32, 8, 12],
    ZET: 4,
    BETA: [3, 14, 6, 2],
    ALPHA: 37
  }
};

const res1 = objSearch(14, obj.FOO); // Exist
const res2 = objSearch(15, obj.FOO); // Does not exist
const res3 = objSearch(37, obj.FOO); // Exist

console.log(res1);
console.log(res2);
console.log(res3);


0 commentaires

1
votes

Essayez cet extrait de code,

Je vérifie les conditions pour les valeurs d'objet, que ce soit son tableau ou sa valeur et la condition appliquée conformément à cela. J'ai également gardé la clé parent dynamique.

var abc = {
  FOO: {
    BAR: [9, 32, 8, 12],
    ZET: 4,
    BETA: [3, 14, 6, 2],
    ALPHA: 37
  },
  DAB: {
    DBAR: [9, 32, 8, 12],
    DZET: 4,
    DBETA: [3, 14, 6, 2],
    DALPHA: 37
  },
};

function retTitle(abc, parent, k) {
  var title = '';
  $.each(abc[parent], function(x, y) {
    if ((Array.isArray(y) && y.indexOf(k) != -1) || (!Array.isArray(y) && y == k)) {
      title = x;
      return;
    }
  });
  return title;
}
var title = retTitle(abc, 'DAB', 4);
console.log(title);


0 commentaires

1
votes

Vous pouvez utiliser une simple boucle for ... in pour parcourir les clés. Vérifiez ensuite si la valeur est un nombre et correspond à ce que vous recherchez. Si ce n'est pas un nombre, c'est un tableau - vous vérifiez donc que ce tableau comprend le nombre que vous recherchez.

var FOO = {
        BAR: [9,32,8,12 ],
        ZET: 4,
        BETA: [3,14,6,2],
        ALPHA: 37
    };

function findKeyByValue(obj, val) {
  for (var i in FOO) {
    if (!obj.hasOwnProperty(i)) continue;
    if (typeof FOO[i] === 'number') {
      if(FOO[i] === val) return i;
    } else {
      if(FOO[i].includes(val)) return i;
    }
  }
}

console.log(findKeyByValue(FOO, 4));


0 commentaires

7
votes

Vous pouvez obtenir les clés, créer un tableau de valeurs et vérifier avec includes . Renvoie la clé trouvée.

function find(object, value) {
    return Object
        .keys(object)
        .find(k => [].concat(object[k]).includes(value));
}

var object = { FOO: { BAR: [9, 32, 8, 12], ZET: 4, BETA: [3, 14, 6, 2], ALPHA: 37 } };

console.log(find(object.FOO, 4));
console.log(find(object.FOO, 8));


1 commentaires

C'est essentiellement là que j'allais avec ça aussi