Сортировка и отбор данных по заранее заданным правилам
Как выполнить такую сортировку? Есть 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));