use filter to return property values in an object

JavascriptFilter

Javascript Problem Overview


Trying to make a function that uses filter but not a for or while loop or foreach function, that will loop through an array of objects only to return their property values. For example,

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

so if I call

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

I should get a return of an array = ["bleh","blah"] I'm just not sure how to implement filter under these guidelines. Also I was thinking of using a chain function maybe .map.

//// Here is the entire code challenge specification/////

Basic: Filter Exercise 4 of 18

Task

Use Array#filter to write a function called getShortMessages.

getShortMessages takes an array of objects with '.message' properties and returns an array of messages that are less than < 50 characters long.

The function should return an array containing the messages themselves, without their containing object.

Arguments

  • messages: an Array of 10 to 100 random objects that look something like this:
{
    message: 'Esse id amet quis eu esse aute officia ipsum.' // random
}

Conditions

  • Do not use any for/while loops or Array#forEach.
  • Do not create any unnecessary functions e.g. helpers.

Hint

  • Try chaining some Array methods!

Example

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

Resources

Boilerplate

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

module.exports = getShortMessages

» To print these instructions again, run: functional-javascript print » To execute your program in a test environment, run: functional-javascript run program.js » To verify your program, run: functional-javascript verify program.js » For help run: functional-javascript help

Javascript Solutions


Solution 1 - Javascript

Use .filter when you want to get the whole object(s) that match the expected property or properties. Use .map when you have an array of things and want to do some operation on those things and get the result.

The challenge is to get all of the messages that are 50 characters or less. So you can use filter to get only the messages that pass that test and then map to get only the message text.

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

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

If it is possible for the input objects to not have a message property, you would want to test for it with obj.message && obj.message.length <= 50 like this:

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

The same code samples in ES6:

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

And if the input objects might not have the message property:

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

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

Solution 2 - Javascript

Though I realize this thread is super old, I felt it necessary to comment in the event that someone stumbles on it again. I would do it like above just using es6 syntax like this:

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

So the above example would be:

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

Solution 3 - Javascript

With custom return value (Simple ES6 Example);

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

Solution 4 - Javascript

In case someone is looking for a single pass through it can be done with .reduce()

So instead of doing:

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

You can do:

const getShortMessages = (messages) => {
  return messages.reduce((shortMessages, i) => {
    if (i.message.length <= 50) {
      shortMessages.push(i.message)
    }
    return shortMessages
  },[])
}

Or if you want even shorter hand:

const getShortMessages = (messages) => messages.reduce((shortMessages, item) => (item.message.length <= 50) 
    ? shortMessages=[...shortMessages,item.message] : shortMessages,[])

Solution 5 - Javascript

In addition, I am using ES6 Destructure with filter and compare two object array. And finally map specific fields those i need actually.

> Initialization

const bumperDealRules =[]; // Array object
const cartItems =[]; // Array object

> Final code

const bumperDealsSelected = bumperDealRules.filter(
            ({ item_display_id: item_display_id, purchasequantity: purchasequantity }) 
            => cartItems.some(({ id: id, action_from: action_from, order_qty:  order_qty }) 
            => id === item_display_id && purchasequantity <= order_qty &&  action_from == 'bumper_deal' ) 
        ).map(function(obj) {
            return { 
                bumper_deal_company_name_id: obj.bumper_deal_company_name_id, 
                from_amount: obj.from_amount,
                to_amount: obj.to_amount,
                discount: obj.discount,
                highest_limit: obj.highest_limit
             };
          });

Attributions

All content for this solution is sourced from the original question on Stackoverflow.

The content on this page is licensed under the Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license.

Content TypeOriginal AuthorOriginal Content on Stackoverflow
QuestionJarg7View Question on Stackoverflow
Solution 1 - JavascriptCymenView Answer on Stackoverflow
Solution 2 - JavascriptjbalesteriView Answer on Stackoverflow
Solution 3 - JavascriptAathiView Answer on Stackoverflow
Solution 4 - JavascriptManfred HView Answer on Stackoverflow
Solution 5 - JavascriptMajedurView Answer on Stackoverflow