упростить вложенное условие для l oop in javascript - PullRequest
0 голосов
/ 26 марта 2020

У меня есть текущий уродливый код для фильтрации массива с определенными c требованиями, есть ли лучшие способы упростить код с помощью функции со стрелками или так, чтобы украсить и сократить код? 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 и не очень уверен, как использовать функцию стрелки в моем случае, некоторые советы будут блестящими. Или, если есть лучшее решение, чтобы получить тот же результат, я буду более чем счастлив узнать из него, ткс.

Ответы [ 2 ]

3 голосов
/ 26 марта 2020

Поскольку ваш выходной массив состоит из элементов вашего входного массива, используйте .filter. Так как вас интересует только ключ ValueSet, вам нужно только проверить этот ключ, вам не нужно перебирать все ключей объекта.

Затем, вам нужно проверить, проходит ли какой-либо из элементов массива тест, и если да, то pu sh весь объект. Правильный метод для проведения такого теста: .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);
1 голос
/ 26 марта 2020

Я использовал ваш код с некоторыми аннотациями.

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