Выбор словарей списка по заданному условию
Есть список словарей типа:
let data = {
"data": [
{ "name": "John", "adress": "Main st", "age": 25 },
{ "name": "John", "adress": "Victory st", "age": 27 },
{ "name": "Jane", "adress": "5 avenue st", "age": 22 },
],
};
У меня задается условие, по которому нужно либо изменить заданный список словарей, либо создать новый:
let condition = {
"condition": {
"include": [
{ "name": "John" },
],
},
};
На выходе должен остаться следующий список словарей:
let data = {
"data": [
{ "name": "John", "adress": "Main st", "age": 25 },
{ "name": "John", "adress": "Victory st", "age": 27 },
],
};
Подскажите, пожалуйста, решение Спасибо
Ответы (2 шт):
Автор решения: Zhihar
→ Ссылка
что мешает решить задачу в лоб?
пройти по массиву и оставить только требуемые словари?
let data = {
"data": [{"name": "John", "adress": "Main st", "age": 25},
{"name": "John", "adress": "Victory st", "age": 27},
{"name": "Jane", "adress": "5 avenue st", "age": 22}]
};
let condition = {
"condition": {
"include": [{"name": "John"}]
}
};
data["data"] = data["data"].filter(element => {
local_condition = condition["condition"];
local_include = local_condition["include"];
for (obj of local_include) {
if (obj["name"] != undefined && element["name"].localeCompare(obj["name"]) == 0) {
return true;
}
}
return false;
})
console.log(data);
Автор решения: Максим Вишневский
→ Ссылка
Если я правильно понял ваш вопрос, то вам нужно сделать не самую тривиальную логику, я бы написал примерно такое решение (для проверки вхождений я использую every, но вам возможно будет необходимо проверять частичное вхождение, тогда лучше использовать some):
const DATA = {
data: [
{ name: "John", adress: "Main st", age: 25 },
{ name: "John", adress: "Victory st", age: 27 },
{ name: "Jane", adress: "5 avenue st", age: 22 },
],
};
const CONDITION = {
condition: {
include: [
{ name: "John" },
],
exclude: [
{ name: "John" },
{ adress: "Victory st" },
],
},
};
const filterByConditions = (items, conditions) => {
// Хендлер для проверки соотвествие всего набора некоторых условий
const _checkCondition = (_conditions, _item) => _conditions
.every((_condition) => {
const [_key] = Object.keys(_condition);
return _item[_key] === _condition[_key];
});
// Извелкаем типы условий
const conditionTypes = Object.keys(conditions);
const result = [];
items.forEach((item) => {
// Проверяем наличие правила включения
// Если оно имеется, то инициируем значением null
// В ином случае мы по умолчанию должны добавлять текущий item
let added = conditionTypes.includes('include') ? null : item;
conditionTypes.forEach((type) => {
// Проверяем выполнение для некоторого набора условий 'include'
if (type === 'include' && _checkCondition(conditions[type], item)) {
added = item;
}
// Проверяем выполнение для некоторого набора условий 'exclude'
if (type === 'exclude' && _checkCondition(conditions[type], item) && added) {
// Прореряем, равно ли текущее значение added исключаемому
added = JSON.stringify(added) === JSON.stringify(item) ? null : item;
}
});
// Если по итогу проверок мы всё ещё имеем лобавляемое, то пушим его
if (added) {
result.push(added);
}
});
return result;
};
console.log(filterByConditions(DATA.data, CONDITION.condition));