web-dev-qa-db-fra.com

Obtention des valeurs d'une clé spécifique à partir de tous les objets d'un tableau

J'exécute une application express.js qui a quelques API alimentant les données dans les listes déroulantes. Les données renvoyées se présentent sous la forme:

  [
    {
        key: 'blah',
        value: 'Blah Blah'
    },
    {
        key: 'foo',
        value: 'Foos'
    },
    {
        key: 'bar',
        value: 'Bars'
    },
    {
        key: 'baz',
        value: 'Bazingo'
    }
];

où clé est ma clé d'option et valeur est le texte affiché. La structure de ce tableau est fixe et je sais pertinemment que j'aurai toujours la clé et la valeur comme champs dans chaque objet du tableau.

Lorsque j'essaie de valider le formulaire soumis (validation côté serveur supplémentaire), je voudrais comparer la valeur fournie pour un champ avec toutes les valeurs de "clé" dans le tableau (blah, foo, bar, baz). Étant donné que ce sera une route fréquemment utilisée, j'aimerais éviter d'itérer sur le tableau pour trouver les valeurs autorisées, à chaque fois. Existe-t-il un moyen plus simple de procéder? En d'autres termes, je sais que je peux utiliser:

 permittedValues = [];
 for (i = 0; i < array.length; i++){
    permittedValues[i] = array[i]["key"];
 }

mais je voudrais éviter cela pour la boucle, si possible.

P.S: Cela semble être une question fondamentale et les réponses que j'ai trouvées en ligne ne répondaient pas exactement à ma question. Donc, je m'excuse si cela a déjà été demandé et répondu.

14
user1452030

Vous pourriez map :

permittedValues = array.map(function(value) {
  return value.key;
});

Dans ES6/ES2015, c'est encore plus joli avec fonctions fléchées :

permittedValues = array.map(value => value.key);

C'est peut-être plus joli, mais ce n'est probablement pas plus rapide qu'une boucle for().

32
Rudie

En utilisant lodash,

Depuis lodash 4.x, la fonction _.pluck a été supprimée pour prendre en charge la fonction map.

afin que vous puissiez réaliser la tâche souhaitée en:

import _ from 'lodash'
_.map(items, 'key');

Réf: Qu'est-il arrivé à Lodash _.pluck?

5
Vraj Solanki

Dans les versions actuelles de Javascript, vous avez besoin d'une boucle.

Cependant, vous pouvez utiliser un module comme npm `lodash 'pour le rendre plus simple

var _ = require('lodash')
var permittedValues = _.pluck(array, 'key')

lien vers la documentation de pluck

0
Jerome WAGNER

Vous pouvez extraire les valeurs via la carte et les former dans une expression régulière pour faire correspondre les valeurs.

Exemple: http://repl.it/X0V

var items=
[
    {
        key: 'blah',
        value: 'Blah Blah'
    },
    {
        key: 'foo',
        value: 'Foos'
    },
    {
        key: 'bar',
        value: 'Bars'
    },
    {
        key: 'baz',
        value: 'Bazingo'
    }
];

var toReg = items.map(function(obj){
    return obj.key; 
}).join('|');
var regex = new RegExp('^('+ toReg +')$');

//To test the regex
var itemsToTest = ['blah', 'Pies', 'foo', 'Bazingo'];
itemsToTest.forEach(function(key){
   if(regex.test(key)){
       console.log(key);
   }
});
0
Gabs00