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.
4 Réponses :
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;
}, {});
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);
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)
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);