web-dev-qa-db-fra.com

utiliser un filtre pour renvoyer les valeurs de propriété dans un objet

Essayer de créer une fonction qui utilise un filtre mais pas une boucle for ou while ou une fonction foreach, qui parcourra un tableau d'objets uniquement pour renvoyer leurs valeurs de propriété. Par exemple,

function getShortMessages(messages) {


    return messages.filter(function(obj){
       return obj.message
    });

donc si j'appelle

getShortMessages([{message:"bleh"},{message:"blah"}]); 

Je devrais obtenir un retour d'un tableau = ["bleh", "blah"] Je ne suis pas sûr de savoir comment implémenter le filtre selon ces directives. Je pensais aussi à utiliser une fonction de chaîne peut-être .map.

//// Voici la spécification complète du défi de code /////

De base: Exercice de filtrage 4 sur 18

Tâche

Utilisez le filtre Array # pour écrire une fonction appelée getShortMessages.

getShortMessages prend un tableau d'objets avec les propriétés '.message' et renvoie un tableau de messages de moins de 50 caractères.

La fonction doit renvoyer un tableau contenant les messages eux-mêmes, sans leur objet conteneur.

Arguments

  • messages: un tableau de 10 à 100 objets aléatoires qui ressemblent à ceci:

    {message: "Esse id amet quis eu esse aute officia ipsum." // au hasard }

Conditions

  • N'utilisez aucune boucle for/while ou Array # forEach.
  • Ne créez pas de fonctions inutiles, par ex. aides.

Allusion

  • Essayez de chaîner certaines méthodes de tableau!

Exemple

[ 'Tempor quis esse consequat sunt ea eiusmod.',
  'Id culpa ad proident ad nulla laborum incididunt.',
  'Ullamco in ea et ad anim anim ullamco est.',
  'Est ut irure irure nisi.' ]

Ressources

Plaque de chaudière

function getShortMessages(messages) {
  // SOLUTION GOES HERE
}

module.exports = getShortMessages

"Pour imprimer à nouveau ces instructions, exécutez: Functional-javascript print" Pour exécuter votre programme dans un environnement de test, exécutez: Functional-javascript run program.js "Pour vérifier votre programme, exécutez: Functional-javascript verify program.js" Pour obtenir de l'aide exécuter: aide fonctionnelle-javascript

25
codemonkey

Utilisation .filter lorsque vous souhaitez obtenir le ou les objets entiers qui correspondent à la ou aux propriétés attendues. Utilisation .map lorsque vous avez un ensemble de choses et que vous souhaitez effectuer certaines opérations sur ces choses et obtenir le résultat.

Le défi consiste à obtenir tous les messages de 50 caractères ou moins. Vous pouvez donc utiliser filter pour obtenir uniquement les messages qui réussissent ce test, puis map pour obtenir uniquement le texte du message.

function getShortMessages(messages) {
  return messages
    .filter(function(obj) {
      return obj.message.length <= 50;
    })
    .map(function(obj) {
      return obj.message;
    });
}

JSFiddle: http://jsfiddle.net/rbbk65sq/

S'il est possible que les objets d'entrée n'aient pas de propriété message, vous voudrez la tester avec obj.message && obj.message.length <= 50 comme ça:

function getShortMessages(messages) {
  return messages
    .filter(function(obj) {
      return obj.message && obj.message.length <= 50;
    })
    .map(function(obj) {
      return obj.message;
    });
}

ES6

Les mêmes exemples de code dans ES6:

const getShortMessages = messages => messages
  .filter(obj => obj.message.length <= 50)
  .map(obj => obj.message);

Et si les objets d'entrée peuvent ne pas avoir la propriété message:

const getShortMessages = messages => messages
  .filter(obj => obj.message && obj.message.length <= 50)
  .map(obj => obj.message);

JSFiddle: http://jsfiddle.net/npfsrwjq/

59
Cymen

Bien que je réalise que ce fil est super ancien, j'ai jugé nécessaire de commenter dans le cas où quelqu'un trébucherait à nouveau dessus. Je le ferais comme ci-dessus en utilisant simplement la syntaxe es6 comme ceci:

objects.filter(obj => obj.key === 'value').map(filteredObj => filteredObj.key);

Ainsi, l'exemple ci-dessus serait:

getShortMessages = (messages) => messages.filter(obj => obj.message.length <= 50).map(obj => obj.message);
4
jbalesteri

Avec une valeur de retour personnalisée (exemple simple ES6);


   const customReturnFiltere = (result) => {
        return products.filter((obj) => {
            return obj.stock !== 0;
          })
          .map((finalResult) => {
            return {
                ...finalResult,
                info: 'product has been filtered if stock is 0' 
            }
          });
    }
0
Aathi