考虑以下任务:
我们列出了欧洲不同城镇的日平均气温。
{ Hamburg: [14, 15, 16, 14, 18, 17, 20, 11, 21, 18, 19,11 ],
Munich: [16, 17, 19, 20, 21, 23, 22, 21, 20, 19, 24, 23],
Madrid: [24, 23, 20, 24, 24, 23, 21, 22, 24, 20, 24, 22],
Stockholm: [16, 14, 12, 15, 13, 14, 14, 12, 11, 14, 15, 14],
Warsaw: [17, 15, 16, 18, 20, 20, 21, 18, 19, 18, 17, 20] }
我们想将这些城镇分为两组:“温暖”和“炎热”。 “温暖”应该 是至少有 3 天温度高于 19 度的城镇。“热” 应该是每天气温大于19度的城镇。
我最后做的是:
const _ = require('lodash');
let cities = {
Hamburg: [14, 15, 16, 14, 18, 17, 20, 11, 21, 18, 19,11 ],
Munich: [16, 17, 19, 20, 21, 23, 22, 21, 20, 19, 24, 23],
Madrid: [24, 23, 20, 24, 24, 23, 21, 22, 24, 20, 24, 22],
Stockholm: [16, 14, 12, 15, 13, 14, 14, 12, 11, 14, 15, 14],
Warsaw: [17, 15, 16, 18, 20, 20, 21, 18, 19, 18, 17, 20]
};
let isHot = (degrees) => {
return degrees > 19;
};
function getMinCategories(cities) {
let res = {
hot: [],
warm: []
};
_.forEach(cities, function(val,key) {
if(_.every(val, isHot)){
res.hot.push(key);
} else if(_.sumBy(val, degree => isHot(degree) ? 1 : 0) > 2){
res.warm.push(key);
}
});
return res;
}
console.log(getMinCategories(cities)); // prints { hot: [ 'Madrid' ], warm: [ 'Munich', 'Warsaw' ] } which is correct
有没有更优雅的方法来检查“至少 3 天温度 > 19”而不是使用 _.sumBy 函数?也许使用 _.some() ?
最佳答案
我包含了一个 vanilla js 解决方案和一个 lodash 解决方案。
普通 JS
您可以使用过滤器计算符合条件的天数:
tempaturesArray.filter((t) => t > 19).length
您可以使用 Array#reduce 使用 vanilla JS 来完成它:
const result = Object.keys(cities).reduce(( obj, city ) => {
const days = cities[city].filter((t) => t > 19).length;
const climate = days === cities[city].length ? 'hot' : (days >= 3 ? 'warm' : null);
climate && obj[climate].push(city);
return obj;
}, { hot: [], warm: []});
const cities = {
Hamburg: [14, 15, 16, 14, 18, 17, 20, 11, 21, 18, 19,11 ],
Munich: [16, 17, 19, 20, 21, 23, 22, 21, 20, 19, 24, 23],
Madrid: [24, 23, 20, 24, 24, 23, 21, 22, 24, 20, 24, 22],
Stockholm: [16, 14, 12, 15, 13, 14, 14, 12, 11, 14, 15, 14],
Warsaw: [17, 15, 16, 18, 20, 20, 21, 18, 19, 18, 17, 20]
};
const result = Object.keys(cities).reduce(( obj, city ) => {
const days = cities[city].filter((t) => t > 19).length;
const climate = days === cities[city].length ? 'hot' : (days >= 3 ? 'warm' : null);
climate && obj[climate].push(city);
return obj;
}, { hot: [], warm: []});
console.log(result);
lodash
使用_.mapValues()将数组转换为冷/暖/热字符串,然后使用 _.invertBy()将值切换为键,并在数组中收集国家名称。我使用 _.sumBy() 来计算天数,但删除了 _.every(),因此一次通过将计算两种气候:
const result = _(cities)
.mapValues((temperature, country) => {
const days = _.sumBy(temperature, (t) => t > 19);
return days === temperature.length ? 'hot' : (days >= 3 ? 'warm' : 'cold');
})
.invertBy()
.pick(['warm', 'hot'])
.value();
const cities = {
Hamburg: [14, 15, 16, 14, 18, 17, 20, 11, 21, 18, 19,11 ],
Munich: [16, 17, 19, 20, 21, 23, 22, 21, 20, 19, 24, 23],
Madrid: [24, 23, 20, 24, 24, 23, 21, 22, 24, 20, 24, 22],
Stockholm: [16, 14, 12, 15, 13, 14, 14, 12, 11, 14, 15, 14],
Warsaw: [17, 15, 16, 18, 20, 20, 21, 18, 19, 18, 17, 20]
};
const result = _(cities)
.mapValues((temperature, country) => {
const days = _.sumBy(temperature, (t) => t > 19);
return days === temperature.length ? 'hot' : (days >= 3 ? 'warm' : 'cold');
})
.invertBy()
.pick(['warm', 'hot'])
.value();
console.log(result);<script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.17.2/lodash.min.js"></script>
关于javascript - lodash - _.some() 带条件/计数器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40990277/
我有一个用户工厂。我希望默认情况下确认用户。但是鉴于unconfirmed特征,我不希望它们被确认。虽然我有一个基于实现细节而不是抽象的工作实现,但我想知道如何正确地做到这一点。factory:userdoafter(:create)do|user,evaluator|#unwantedimplementationdetailshereunlessFactoryGirl.factories[:user].defined_traits.map(&:name).include?(:unconfirmed)user.confirm!endendtrait:unconfirmeddoenden
我有一些代码在几个不同的位置之一运行:作为具有调试输出的命令行工具,作为不接受任何输出的更大程序的一部分,以及在Rails环境中。有时我需要根据代码的位置对代码进行细微的更改,我意识到以下样式似乎可行:print"Testingnestedfunctionsdefined\n"CLI=trueifCLIdeftest_printprint"CommandLineVersion\n"endelsedeftest_printprint"ReleaseVersion\n"endendtest_print()这导致:TestingnestedfunctionsdefinedCommandLin
我有一个只接受一个参数的方法:defmy_method(number)end如果使用number调用方法,我该如何引发错误??通常,我如何定义方法参数的条件?比如我想在调用的时候报错:my_method(1) 最佳答案 您可以添加guard在函数的开头,如果参数无效则引发异常。例如:defmy_method(number)failArgumentError,"Inputshouldbegreaterthanorequalto2"ifnumbereputse.messageend#=>Inputshouldbegreaterthano
尝试在我的RoR应用程序中实现计数器缓存列时出现错误Unknownkey(s):counter_cache。我在这个问题中实现了模型关联:Modelassociationquestion这是我的迁移:classAddVideoVotesCountToVideos0Video.reset_column_informationVideo.find(:all).eachdo|p|p.update_attributes:videos_votes_count,p.video_votes.lengthendenddefself.downremove_column:videos,:video_vot
我正在尝试按0-9和a-z的顺序创建数字和字母列表。我有一组值value_array=['0','1','2','3','4','5','6','7','8','9','a','b','光盘','e','f','g','h','i','j','k','l','m','n','o','p','q','r','s','','u','v','w','x','y','z']和一个组合列表的数组,按顺序,这些数字可以产生x个字符,比方说三个list_array=[]和一个当前字母和数字组合的数组(在将它插入列表数组之前我会把它变成一个字符串,]current_combo['0','0','0']
我的Gallery模型中有以下查询:media_items.includes(:photo,:video).rank(:position_in_gallery)我的图库模型有_许多媒体项,每个都有一个照片或视频关联。到目前为止,一切正常。它返回所有media_items包括它们的photo或video关联,由media_item的position_in_gallery属性排序。但是我现在需要将此查询返回的照片限制为仅具有is_processing属性的照片,即nil。是否可以进行相同的查询,但条件是返回的照片等同于:.where(photo:'photo.is_processingIS
除了可访问性标准不鼓励使用这一事实指向当前页面的链接,我应该怎么做重构以下View代码?#navigation%ul.tabbed-ifcurrent_page?(new_profile_path)%li{:class=>"current_page_item"}=link_tot("new_profile"),new_profile_path-else%li=link_tot("new_profile"),new_profile_path-ifcurrent_page?(profiles_path)%li{:class=>"current_page_item"}=link_tot("p
我遇到了一个非常奇怪的问题,我很难解决。在我看来,我有一个与data-remote="true"和data-method="delete"的链接。当我单击该链接时,我可以看到对我的Rails服务器的DELETE请求。返回的JS代码会更改此链接的属性,其中包括href和data-method。再次单击此链接后,我的服务器收到了对新href的请求,但使用的是旧的data-method,即使我已将其从DELETE到POST(它仍然发送一个DELETE请求)。但是,如果我刷新页面,HTML与"new"HTML相同(随返回的JS发生变化),但它实际上发送了正确的请求类型。这就是这个问题令我困惑的
我正在尝试按Rails相关模型中的字段进行排序。我研究的所有解决方案都没有解决如果相关模型被另一个参数过滤?元素模型classItem相关模型:classPriority我正在使用where子句检索项目:@items=Item.where('company_id=?andapproved=?',@company.id,true).all我需要按相关表格中的“位置”列进行排序。问题在于,在优先级模型中,一个项目可能会被多家公司列出。因此,这些职位取决于他们拥有的company_id。当我显示项目时,它是针对一个公司的,按公司内的职位排序。完成此任务的正确方法是什么?感谢您的帮助。PS-我
基本上,我只是试图在满足特定条件时停止程序运行其余行。unlessraw_information.firstputs"Noresultswerereturnedforthatquery"breakend然而,在程序运行之前我得到了这个错误:Invalidbreakcompileerror(SyntaxError)执行此操作的正确方法是什么? 最佳答案 abort("Noresultswerereturnedforthatquery")unlesscondition或unlessconditionabort("Noresultswer