简化javascript中循环的嵌套条件

问题描述 投票:0回答:2

我有当前丑陋的代码来过滤具有特定要求的数组,是否有更好的方法通过使用箭头功能或诸如此类来美化和缩短代码来简化代码? 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
2个回答
3
投票

由于输出数组由输入数组的元素组成,请使用.filter。由于您还只关心ValueSet键,因此只需要检查该键,就不需要遍历对象键的all

然后,您需要检查数组中的任何元素是否通过测试,如果通过,则推入整个对象。进行此类测试的正确方法是.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);

0
投票

我在代码中加上了一些注释。

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);
© www.soinside.com 2019 - 2024. All rights reserved.