Uncaught TypeError: acc.push is not a function. При использовании рекурсии
Есть структура данных, неограниченного уровня вложенности, на основании которой нужно создать новый массив. Используя reduce().
При вызове acc.push(getORDSFilter(item)) код падает на втором уровне вызова.
Как я вижу - ошибка возникает уже после выхода из метода. Код и консоль прикладываю. Вызовов этого кода ниже - нет. Без рекурсивного аргумента отрабатывает как нужно.
const getORDSFilter = (dxFilter: any) => {
console.log('Вызов метода с параметрами', dxFilter)
let condition: string = 'and'
if (dxFilter && Array.isArray(dxFilter?.[dxFilter?.length - 1])) {
condition = dxFilter[1] as string
}
if (isGroupFilter(dxFilter)) {
console.log('Есть вложенность', isGroupFilter(dxFilter))
const filter = dxFilter?.reduce((acc: any[], item: any) => {
if (Array.isArray(item)) {
acc.push(getORDSFilter(item))
}
acc.push(parseFilterQuery(item))
return acc
}, {})
return {[`$${condition}`]: filter}
} else {
console.log('Вложенности нет, else')
return {[`$${condition}`]: parseFilterQuery(dxFilter)}
}
}
Ответы (1 шт):
Автор решения: Селюк Михаил
→ Ссылка
Проблема в первоначальном значении reduce. Нужно передавать объект, а не массив, т.к. я работал с методом push. Спасибо SwaD, ответ в его комментарии.