简化 javascript 中循环的嵌套条件

simplify the nested condition for loop in javascript

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

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。

因为您的输出数组由输入数组的元素组成,所以使用 .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);

我使用了你的代码和一些注释。

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);