尝试创建一个使用过滤器而不是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。' //随机 }
[ '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
答案 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中的相同代码示例:
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
};
});