Сортировка и отбор данных по заранее заданным правилам

Как выполнить такую сортировку? Есть JSON обьект с условием исключить все данные с disabled: true и метод sort_by который отберет юзером с рейтингом и их почтой

{"data": [{"user": "[email protected]", "rating": 10, "disabled": false},
{"user": "[email protected]", "rating": 26, "disabled": false},
{"user": "[email protected]", "rating": 23, "disabled": true}],
"condition": {"exclude": [{"disabled": true}], "sort_by": ["rating"]}}

и вывести такой готовый обьект

{"result": [{"user": "[email protected]", "rating": 14, "disabled": false},
{"user": "[email protected]", "rating": 20, "disabled": false}]}

Если понимаете как, напишите код, буду благодарен


Ответы (1 шт):

Автор решения: SwaD

Работает с любым набором условий condition по exclude и сортирует по любым ключам из sort_by Условие - ключи из exclude и sort_by должны гарантированно быть в ключах из data. Я это условие не проверял.

const dataSet = {
    "data": [
        {"user": "[email protected]", "rating": 10, "disabled": false},
        {"user": "[email protected]", "rating": 26, "disabled": false},
        {"user": "[email protected]", "rating": 23, "disabled": true}],
    "condition": {"exclude": [{"disabled": true}], "sort_by": ["rating"]
    }
}
 
const sortsCondition = [];

function sortBy(a, b) {
    if (!sortsCondition.length) return 0;
    for (let i in sortsCondition) {
        const sort = sortsCondition[i];
        if (a[sort] > b[sort] || a[sort] < b[sort]) {
            return (a[sort] > b[sort]) ? 1 : -1;
        }
    }
    return 0;
}

function getter(data) {
    const list = data.data;
    data.condition.sort_by.forEach((el) => {
        sortsCondition.push(el)
    })
    const exclude = {};
    for (let i in data.condition.exclude) {
        const cond = data.condition.exclude[i];
        for (let j in cond) {
            exclude[j] = cond[j]
        }
    }

    const result = {
        result: []
    }
    list.forEach((item) => {
        let flg = true;
        for (let i in item) {
            if (exclude.hasOwnProperty(i) && exclude[i] === item[i]) {
                flg = false;
                break;
            }
        }
        if (flg) {
            result.result.push(item);
        }
    });
    result.result.sort(sortBy);
    return result;
}

console.log(getter(dataSet));
→ Ссылка