1
votes

Comment faire correspondre un modèle dans un objet javascript

Existe-t-il une méthode lodash que je peux utiliser pour la correspondance de modèles en javascript pour le problème suivant?

J'ai les clés = [x, y, z] et object = {x: 'a', x0: 'a0', y: 'b', y0: 'b1 ', y1:' c ', k:' k ', k1:' k1 '..}

Je dois obtenir le résultat sous la forme {x: 'a', x0: 'a0', y: 'b', y0: 'b1', y1: 'c'} . < / p>

Fondamentalement, je dois donner un tableau de clés et un objet, et il devrait renvoyer un objet avec toutes les clés qui ont l'une des clés choisies comme sous-chaîne.


0 commentaires

4 Réponses :


0
votes

Je ne connais aucune méthode lodash qui fasse cela, mais ce n'est pas si compliqué:

const keys = ['x', 'y', 'z'];
const obj = { x: 'a', x0: 'a0', y: 'b' ,y0:'b1', y1:'c' };
const matched = keys.reduce((acc, key) => {
  Object.entries(obj)
    .filter(([k]) => k.includes(key))
    .forEach(([k, v]) => (acc[k] = v));
  return acc;
}, {});


0 commentaires

1
votes

Je ne suis pas sûr de lodash , mais vous pouvez le faire en utilisant JavaScript natif assez simplement:

const keys = [ 'x', 'y', 'z'];
const object = { x: 'a', x0: 'a0', y: 'b', y0:'b1', y1:'c', k:'k', k1:'k1'};

const validEntries = Object.entries(object)
  .filter(([key, val]) => keys.some(k => key.includes(k)));
const result = Object.fromEntries(validEntries);
console.log(result);


0 commentaires

0
votes

Vous pouvez parcourir les clés de l'objet et vérifier le tableau des clés

const keys = ['x', 'y', 'z'] 
const object = { x: 'a', x0: 'a0', y: 'b' ,y0:'b1', y1:'c', k:'k' ,k1:'k1'}

// result as = { x: 'a', x0: 'a0', y: 'b' ,y0:'b1', y1:'c'}

const result = Object.keys(object).reduce((acc, rec) => {
  // if current key has sub-string for any value in keys array
  if(keys.filter(it => rec.indexOf(it) > -1).length > 0) {
    return {...acc, [rec]: object[rec]}
  }
  return acc
}, {})

console.log(result)


0 commentaires

0
votes

Vous pouvez utiliser pickBy mais avec un prédicat personnalisé

<script src="https://cdn.jsdelivr.net/npm/lodash@4.17.15/lodash.min.js"></script>
const keyIncludes = (partialKeys) => (value, key) => partialKeys.some(partialKey => key.includes(partialKey));

const keys = [ 'x', 'y', 'z'];
const object = { x: 'a', x0: 'a0', y: 'b' ,y0:'b1', y1:'c', k:'k' ,k1:'k1'};

const filtered = _.pickBy(object, keyIncludes(keys));

console.log(filtered);

Et si vous voulez réutiliser ceci pour différentes clés, vous pouvez créer une fonction "prédicat" pour réutiliser les données

<script src="https://cdn.jsdelivr.net/npm/lodash@4.17.15/lodash.min.js"></script>
const keys = [ 'x', 'y', 'z'];
const object = { x: 'a', x0: 'a0', y: 'b' ,y0:'b1', y1:'c', k:'k' ,k1:'k1'};

const filtered = _.pickBy(object, (value,key)=>keys.some(k=>key.includes(k)));

console.log(filtered);


0 commentaires