【问题标题】:simplify the nested condition for loop in javascript简化javascript中for循环的嵌套条件
【发布时间】:2020-03-26 07:40:14
【问题描述】:

我目前有丑陋的代码来过滤具有特定要求的数组,有没有更好的方法通过使用箭头函数等来简化代码以美化和缩短代码? tks。

const NewTraitSet = [
    {
        "ValueSet": [
            {
                "Units": null, 
                "Type": "description A", 
                "Value": "description A"
            }, 
            {
                "Units": null, 
                "Type": "description B", 
                "Value": "description B"
            },
            {
                "Units": null, 
                "Type": "risk category", 
                "Value": "Decreased Risk"
            }
        ], 
        "TraitInterpretation": "TraitInterpretation", 
        "TraitCategory": "Health"
    },{
        "ValueSet": [
            {
                "Units": null, 
                "Type": "description A", 
                "Value": "description A"
            }, 
            {
                "Units": null, 
                "Type": "description B", 
                "Value": "description B"
            },
            {
                "Units": null, 
                "Type": "risk category", 
                "Value": "Increased Risk"
            }
        ], 
        "TraitInterpretation": "TraitInterpretation", 
        "TraitCategory": "DD Health", 
    }
]

const result = []
function fun(item, index) {
    for (var key in item) {
        if (key == "ValueSet") {
            for (var obj in item[key]) {
                if (item[key][obj]["Type"] == "risk category" && item[key][obj]["Value"] == "Decreased Risk") {
                    result.push(item)
                }
            }
        }
    }
    return result
}

NewTraitSet.forEach(fun)
// sort traits by name
result.sort((a, b) => (a.TraitCategory > b.TraitCategory ? 1 : -1))

console.log(result)

我对 javascript 很陌生,不太确定在我的情况下如何使用箭头功能,一些建议会很棒。或者如果有更好的解决方案来获得相同的结果,我将非常乐意从中学习,tks。

【问题讨论】:

    标签: javascript for-loop nested-loops arrow-functions


    【解决方案1】:

    由于您的输出数组由输入数组的元素组成,因此请使用.filter。由于您也只关心ValueSet 键,因此您只需检查该键,无需遍历对象的所有键。

    然后,您需要检查数组中的任何元素是否通过测试,如果是,则推送整个对象。执行此类测试的正确方法是.some

    const NewTraitSet=[{ValueSet:[{Units:null,Type:"description A",Value:"description A"},{Units:null,Type:"description B",Value:"description B"},{Units:null,Type:"risk category",Value:"Decreased Risk"}],TraitInterpretation:"TraitInterpretation",TraitCategory:"Health"},{ValueSet:[{Units:null,Type:"description A",Value:"description A"},{Units:null,Type:"description B",Value:"description B"},{Units:null,Type:"risk category",Value:"Increased Risk"}],TraitInterpretation:"TraitInterpretation",TraitCategory:"DD Health"}];
    
    const result = NewTraitSet.filter(item => item.ValueSet.some(
      ({ Type, Value }) => Type === 'risk category' && Value === 'Decreased Risk'
    ));
    console.log(result);

    或者,如果您不喜欢解构:

    const NewTraitSet=[{ValueSet:[{Units:null,Type:"description A",Value:"description A"},{Units:null,Type:"description B",Value:"description B"},{Units:null,Type:"risk category",Value:"Decreased Risk"}],TraitInterpretation:"TraitInterpretation",TraitCategory:"Health"},{ValueSet:[{Units:null,Type:"description A",Value:"description A"},{Units:null,Type:"description B",Value:"description B"},{Units:null,Type:"risk category",Value:"Increased Risk"}],TraitInterpretation:"TraitInterpretation",TraitCategory:"DD Health"}];
    
    const result = NewTraitSet.filter(item => item.ValueSet.some(
      inner => inner.Type === 'risk category' && inner.Value === 'Decreased Risk'
    ));
    console.log(result);

    【讨论】:

      【解决方案2】:

      我在您的代码中使用了一些注释。

      const
          newTraitSet = [{ ValueSet: [{ Units: null, Type: "description A", Value: "description A" }, { Units: null, Type: "description B", Value: "description B" }, { Units: null, Type: "risk category", Value: "Decreased Risk" }], TraitInterpretation: "TraitInterpretation", TraitCategory: "Health" }, { ValueSet: [{ Units: null, Type: "description A", Value: "description A" }, { Units: null, Type: "description B", Value: "description B" }, { Units: null, Type: "risk category", Value: "Increased Risk" }], TraitInterpretation: "TraitInterpretation", TraitCategory: "DD Health" }],
          result = [];
      
      function fun(item) { // remove unused variables
          //for (var key in item) { // remove this, because you need only a single property
          if (!("ValueSet" in item)) return; // return early, if "ValueSet" not exists in rhe object
          // if (key == "ValueSet") {// remove check, because no iteration over the keys
          for (let obj of item.ValueSet) { // use `of` for the values and key directly
              if (obj.Type == "risk category" && obj.Value == "Decreased Risk") { // dot notation for known property
                  result.push(item);
              }
          }
          //}
          //}
          // return result; // makes no sense in `forEach`. the return value is never used
      }
      
      newTraitSet.forEach(fun);
      
      result.sort((a, b) => a.TraitCategory.localeCompare(b.TraitCategory ? 1 : -1)); // sort by strings
      
      console.log(result);

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2022-01-26
        • 2012-06-23
        • 2022-12-07
        • 2013-07-19
        • 2019-04-21
        • 1970-01-01
        相关资源
        最近更新 更多