использовать фильтр для возврата значений свойств в объект

Попытка сделать функцию, которая использует фильтр, но не функцию for или while или foreach, которая будет циклически перебирать массив объектов только для возврата значений свойств. Например,

function getShortMessages(messages) {


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

поэтому, если я позвоню

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

Я должен получить возврат массива = ["bleh", "blah"] Я просто не уверен, как реализовать фильтр в соответствии с этими рекомендациями. Также я думал об использовании функции цепочки, возможно,.map.

////Вот вся спецификация вызова кода /////

Basic: Filter Упражнение 4 из 18

задача

Используйте фильтр Array #, чтобы написать функцию getShortMessages.

getShortMessages принимает массив объектов с свойствами ".message" и возвращает массив сообщений длиной менее 50 символов.

Функция должна возвращать массив, содержащий сами сообщения, без их содержащего объекта.

аргументы

  • messages: массив от 10 до 100 случайных объектов, которые выглядят примерно так:

    {message: 'Esse id amet quis eu esse aute officia ipsum.' //random }//random}

условия

  • Не используйте для циклов /while или Array # forEach.
  • Не создавайте ненужных функций, например, помощников.

намек

  • Попробуйте связать несколько методов Array!

пример

[ '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.' ]

Ресурсы

Boilerplate

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

module.exports = getShortMessages

"Чтобы снова напечатать эти инструкции, запустите: function-javascript print" Чтобы выполнить вашу программу в тестовой среде, запустите: function-javascript run program.js "Чтобы проверить вашу программу, запустите: function-javascript verify program.js" Для справки run: функциональная поддержка javascript

Ответы

Ответ 1

Используйте .filter если вы хотите получить весь объект (ы), которые соответствуют ожидаемому свойству или свойствам. Используйте .map когда у вас есть множество вещей, и вы хотите сделать какую-то операцию над этими вещами и получить результат.

Задача состоит в том, чтобы получить все сообщения длиной не более 50 символов. Таким образом, вы можете использовать filter чтобы получать только те сообщения, которые прошли этот тест, а затем map чтобы получить только текст сообщения.

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

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

Если входные объекты могут не иметь свойства message, вы можете проверить его с помощью obj.message && obj.message.length <= 50 следующим образом:

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

ES6

Те же примеры кода в ES6:

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

И если входные объекты могут не иметь свойства message:

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

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

Ответ 2

Хотя я понимаю, что эта тема очень стар, я счел необходимым прокомментировать в случае, если кто-то снова наткнется на нее. Я бы сделал это, как описано выше, используя синтаксис es6 следующим образом:

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

Таким образом, приведенный выше пример:

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

Ответ 3

С пользовательским возвращаемым значением (Простой пример 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' 
            }
          });
    }