Skip to content

Instantly share code, notes, and snippets.

@ToTheHit
Created January 11, 2022 11:16
Show Gist options
  • Save ToTheHit/cd24f58963e4554e5da8b1fc6e131fcb to your computer and use it in GitHub Desktop.
Save ToTheHit/cd24f58963e4554e5da8b1fc6e131fcb to your computer and use it in GitHub Desktop.
const numberOperators = ['$lt', '$gt', '$gte', '$lte', '$eq', '$ne'];
// TODO: Добавить поддержку otherOperators
const otherOperators = ['$eq', '$ne'];
/*
Пример объекта на вход:
const valueRaw = {
prepayment: {
value: {
$gte: '10000',
$lte: '20000'
},
date: 123
}
};
Пример выходных значений:
1. getObjectKeys:
[ 'prepayment.value.$gte', 'prepayment.value.$lte', 'prepayment.date' ]
2.1. getObjectKeysWithValuesByArray (join = true):
[
{ 'prepayment.value.$gte': '10000' },
{ 'prepayment.value.$lte': '20000' },
{ 'prepayment.date': 123 }
]
2.2. getObjectKeysWithValuesByArray (join = false):
[
{ 'prepayment.value': { '$gte': '10000' } },
{ 'prepayment.value': { '$lte': '20000' } },
{ 'prepayment.date': 123 }
]
3.1. getObjectKeysWithValuesByObject (join = true):
{
'prepayment.value': { '$gte': '10000', '$lte': '20000' },
'prepayment.date': 123
}
3.2. getObjectKeysWithValuesByObject (join = false):
{
'prepayment.value.$gte': '10000',
'prepayment.value.$lte': '20000',
'prepayment.date': 123
}
*/
function getObjectKeys(object, prefix = '') {
return Object.keys(object).reduce((acc, key) => {
if (Object(object[key]) === object[key]) {
acc.push(...getObjectKeys(object[key], `${prefix}${prefix.length > 0 ? '.' : ''}${key}`));
} else {
acc.push(`${prefix}${prefix.length > 0 ? '.' : ''}${key}`);
}
return acc;
}, []);
}
function getObjectKeysWithValuesByArray(o, prefix = '', join = false) {
return Object.keys(o).reduce((acc, key) => {
if (Object(o[key]) === o[key]) {
acc.push(...getObjectKeysWithValuesByArray(o[key], `${prefix}${prefix.length > 0 ? '.' : ''}${key}`, join));
} else if (numberOperators.includes(key)) {
if (join) {
acc.push({ [`${prefix}.${key}`]: o[key] });
} else {
acc.push({
[prefix]: {
[key]: o[key]
}
});
}
} else {
acc.push({
[`${prefix}${prefix.length > 0 ? '.' : ''}${key}`]: o[key]
});
}
return acc;
}, []);
}
function getObjectKeysWithValuesByObject(o, prefix = '', join = false) {
return Object.keys(o).reduce((acc, key) => {
if (Object(o[key]) === o[key]) {
Object.assign(acc, {
...getObjectKeysWithValuesByObject(o[key], `${prefix}${prefix.length > 0 ? '.' : ''}${key}`, join)
});
} else if (numberOperators.includes(key)) {
if (join) {
if (acc[prefix]) {
acc[prefix][key] = o[key];
} else {
Object.assign(acc, {
[prefix]: {
[key]: o[key]
}
});
}
} else {
Object.assign(acc, {
[`${prefix}.${key}`]: o[key]
});
}
} else {
const updatedKey = `${prefix}${prefix.length > 0 ? '.' : ''}${key}`;
Object.assign(acc, {
[updatedKey]: o[key]
});
}
return acc;
}, {});
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment