jjzjj

javascript - lodash - _.some() 带条件/计数器

coder 2025-03-13 原文

考虑以下任务:

我们列出了欧洲不同城镇的日平均气温。

{ 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/

有关javascript - lodash - _.some() 带条件/计数器的更多相关文章

  1. ruby - 如何根据特征实现 FactoryGirl 的条件行为 - 2

    我有一个用户工厂。我希望默认情况下确认用户。但是鉴于unconfirmed特征,我不希望它们被确认。虽然我有一个基于实现细节而不是抽象的工作实现,但我想知道如何正确地做到这一点。factory:userdoafter(:create)do|user,evaluator|#unwantedimplementationdetailshereunlessFactoryGirl.factories[:user].defined_traits.map(&:name).include?(:unconfirmed)user.confirm!endendtrait:unconfirmeddoenden

  2. ruby - 在 Ruby 中有条件地定义函数 - 2

    我有一些代码在几个不同的位置之一运行:作为具有调试输出的命令行工具,作为不接受任何输出的更大程序的一部分,以及在Rails环境中。有时我需要根据代码的位置对代码进行细微的更改,我意识到以下样式似乎可行:print"Testingnestedfunctionsdefined\n"CLI=trueifCLIdeftest_printprint"CommandLineVersion\n"endelsedeftest_printprint"ReleaseVersion\n"endendtest_print()这导致:TestingnestedfunctionsdefinedCommandLin

  3. ruby - 定义方法参数的条件 - 2

    我有一个只接受一个参数的方法:defmy_method(number)end如果使用number调用方法,我该如何引发错误??通常,我如何定义方法参数的条件?比如我想在调用的时候报错:my_method(1) 最佳答案 您可以添加guard在函数的开头,如果参数无效则引发异常。例如:defmy_method(number)failArgumentError,"Inputshouldbegreaterthanorequalto2"ifnumbereputse.messageend#=>Inputshouldbegreaterthano

  4. ruby-on-rails - Ruby on Rails 计数器缓存错误 - 2

    尝试在我的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

  5. ruby - 使用多个数组创建计数 - 2

    我正在尝试按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']

  6. ruby-on-rails - 使用包含多个关联和单独的条件 - 2

    我的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

  7. ruby-on-rails - 在 haml View 中重构条件 - 2

    除了可访问性标准不鼓励使用这一事实指向当前页面的链接,我应该怎么做重构以下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

  8. ruby-on-rails - 使用 javascript 更改数据方法不会更改 ajax 调用用户的什么方法? - 2

    我遇到了一个非常奇怪的问题,我很难解决。在我看来,我有一个与data-remote="true"和data-method="delete"的链接。当我单击该链接时,我可以看到对我的Rails服务器的DELETE请求。返回的JS代码会更改此链接的属性,其中包括href和data-method。再次单击此链接后,我的服务器收到了对新href的请求,但使用的是旧的data-method,即使我已将其从DELETE到POST(它仍然发送一个DELETE请求)。但是,如果我刷新页面,HTML与"new"HTML相同(随返回的JS发生变化),但它实际上发送了正确的请求类型。这就是这个问题令我困惑的

  9. ruby-on-rails - 在具有 ActiveRecord 条件的相关模型中按字段排序 - 2

    我正在尝试按Rails相关模型中的字段进行排序。我研究的所有解决方案都没有解决如果相关模型被另一个参数过滤?元素模型classItem相关模型:classPriority我正在使用where子句检索项目:@items=Item.where('company_id=?andapproved=?',@company.id,true).all我需要按相关表格中的“位置”列进行排序。问题在于,在优先级模型中,一个项目可能会被多家公司列出。因此,这些职位取决于他们拥有的company_id。当我显示项目时,它是针对一个公司的,按公司内的职位排序。完成此任务的正确方法是什么?感谢您的帮助。PS-我

  10. ruby - 如果满足给定条件,则结束 ruby​​ 程序 - 2

    基本上,我只是试图在满足特定条件时停止程序运行其余行。unlessraw_information.firstputs"Noresultswerereturnedforthatquery"breakend然而,在程序运行之前我得到了这个错误:Invalidbreakcompileerror(SyntaxError)执行此操作的正确方法是什么? 最佳答案 abort("Noresultswerereturnedforthatquery")unlesscondition或unlessconditionabort("Noresultswer

随机推荐