Я пытаюсь создать глубоко вложенный объект JS из простого массива. Сложность заключается в том, что следующий элемент массива всегда должен добавляться к предыдущему.
Предполагая, что мой массив выглядит так:
const filters = [
[
{brand: {eq: 'BMW'}},
{brand: {eq: 'AUDI'}}
],
[
{year: {eq: '2019'}},
{year: {eq: '2020'}}
],
[
{country: {eq: 'CH'}},
{country: {eq: 'DE'}}
]
]
Как я могу получить объект с этой структурой?
query: {
and: {
or: [
{ brand: { eq: 'BMW' } },
{ brand: { eq: 'AUDI' } }
],
and: {
or: [
{ year: { eq: '2019' } },
{ year: { eq: '2020' } }
],
and: {
or: [
{ country: { eq: 'CH' } },
{ country: { eq: 'DE' } }
],
... and so on
}
}
}
},
Как мне добиться добавления нового блока «или» к предыдущему блоку «или»?
Вы можете создать вложенную структуру по мере прохождения массива. Для каждого элемента добавьте вложенный объект с ключом or
, который ссылается на элемент, и каждая последующая итерация работает с предыдущим элементом.
const filters = [
[
{brand: {eq: 'BMW'}},
{brand: {eq: 'AUDI'}}
],
[
{year: {eq: '2019'}},
{year: {eq: '2020'}}
],
[
{country: {eq: 'CH'}},
{country: {eq: 'DE'}}
]
]
const query = {};
let current = query;
for (const filter of filters) {
current.and = { or: filter };
current = current.and;
}
console.info(query);
Кстати, версия reduce
не ужасна, но я считаю ее совершенно ненужной: query = {}; filters.reduce((current, filter) => { current.and = { or: filter }; return current.and}, query)
@ sp00m Меня не очень беспокоит хакерство. Меня больше всего беспокоит, что reduce
в основном цикл, так как результат игнорируется. Мы также можем сократить for..of
аналогичным образом: for (const or of filters) current = current.and = { or }
Хотя, я думаю, reduce
можно больше играть в гольф.
Только для reduce
вызова:
const filters = [
[
{brand: {eq: 'BMW'}},
{brand: {eq: 'AUDI'}}
],
[
{year: {eq: '2019'}},
{year: {eq: '2020'}}
],
[
{country: {eq: 'CH'}},
{country: {eq: 'DE'}}
]
];
const query = {};
filters.reduce((x, or) => x.and = { or }, query);
console.info(query);
Хаки, как черт, однако:
reduce
с побочными эффектамиПодход ВЛАЗа - это путь.
Не рекомендуется, но, по крайней мере, это весело. Просто ради полноты, в этом нет серьезного недостатка, кроме удобочитаемости. Возврат значения из присваивания, вероятно, является худшим нарушением здесь, но в целом это не страшно.
Иногда ничто не сравнится со старым добрым
for
циклом.