使用filter返回对象中的属性值

时间:2015-07-03 07:40:26

标签: javascript filter

尝试创建一个使用过滤器而不是for或while循环或foreach函数的函数,它将遍历一个对象数组,只返回它们的属性值。例如,

function getShortMessages(messages) {


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

所以,如果我打电话

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

我应该返回一个数组= [“bleh”,“blah”] 我只是不确定如何在这些指导下实施过滤器。我也在考虑使用链式函数。可能.map。

////这是整个代码挑战规范/////

基本:过滤  练习4 of 18

任务

使用Array#filter编写一个名为getShortMessages的函数。

getShortMessages获取具有“.message”属性的对象数组,并返回小于<< 50个字符。

该函数应该返回一个包含消息本身的数组,而不包含它们包含的对象。

参数

  • 消息:一个包含10到100个随机对象的数组,如下所示:

    {   消息:'Esse id amet quis eu esse aute officia ipsum。' //随机 }

条件

  • 不要使用任何for / while循环或Array#forEach。
  • 不要创建任何不必要的功能,例如助手。

提示

  • 尝试链接一些数组方法!

实施例

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

资源

样板

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

module.exports = getShortMessages

»要再次打印这些说明,请运行:functional-javascript print  »要在测试环境中执行程序,请运行:functional-javascript run program.js  »要验证您的程序,请运行:functional-javascript verify program.js  »如需帮助,请运行:functional-javascript help

5 个答案:

答案 0 :(得分:47)

如果要获取与预期属性匹配的整个对象,请使用.hg。当你有一系列的东西时,请使用.filter,并希望对这些事情进行一些操作并获得结果。

挑战是获取50个字符或更少的所有消息。因此,您可以使用.map仅获取通过该测试的消息,然后使用filter仅获取消息文本。

map

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

如果输入对象可能没有function getShortMessages(messages) { return messages .filter(function(obj) { return obj.message.length <= 50; }) .map(function(obj) { return obj.message; }); } 属性,您可能希望使用message进行测试,如下所示:

obj.message && obj.message.length <= 50

ES6

ES6中的相同代码示例:

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

如果输入对象可能没有const getShortMessages = messages => messages .filter(obj => obj.message.length <= 50) .map(obj => obj.message); 属性:

message

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

答案 1 :(得分:4)

虽然我意识到这个帖子已经超级老了,但我觉得有必要在有人再次发现它的情况下发表意见。我会像上面这样使用es6语法这样做:

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

所以上面的例子是:

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

答案 2 :(得分:1)

如果有人要通过一次通行证,可以使用.reduce()

所以不要这样做:

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

您可以这样做:

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

或者如果您想要更短的手:

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

答案 3 :(得分:0)

具有自定义返回值(简单的ES6示例);

select uuid_generate_v5('e90bf6ab-f698-4faa-9d0f-810917dea53a', 'e90bf6ab-f698-4faa-9d0f-810917dea53a');
           uuid_generate_v5
--------------------------------------
 6c569b95-a6fe-5553-a6f5-cd871ab30178

答案 4 :(得分:0)

此外,我将ES6 Destruct与过滤器配合使用,并比较两个对象数组。最后映射我实际需要的特定字段。

初始化

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

最终密码

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
             };
          });