dpablo_escobarr
@dpablo_escobarr

Дополняется константа массива, хотя явного преобразования нет. Как решить?

const tiles = outlineRectSize(x, y, index, active, mainMap)
Данная строчка в первом вызове отрабатывает нормально. Но при вызовe только лишь функции outlineRectSize('аргументы')далее в коде, которая вызывается второй раз, но приравнивается к константе tiles - при просмотре в консоли она приобретает новые элементы внутри себя с сохранением предыдущих.
Вот весь код:
x = 1
    y = 3
    index = 4
    mainMap = 
        [
            [5,5,4,4,4,5],
            [4,5,4,4,4,4],
            [4,3,3,3,3,4],
            [4,2,2,2,2,4],
            [4,4,4,4,4,4]
        ]
    active = true


const tiles = outlineRectSize(x, y, index, active, mainMap)


let roundTile = function (){

    
    for(let i = 0; tiles.from_pass.length > i; i++){
    
        
        if(tiles.from_pass[i] != undefined){


            this.currX = tiles.from_pass[i].match(/x:([0-9]{1,500})/)[1]
            this.currY = tiles.from_pass[i].match(/y:([0-9]{1,500})/)[1]

            if(tiles.passed.indexOf(`x:${this.currX}, y:${this.currY}`) == -1){

                outlineRectSize(this.currX, this.currY, index, active, mainMap, tiles.from_pass)
            }
        }
    }


   console.log(tiles)
    // return tiles
}

roundTile()


function outlineRectSize(p_x, p_y, p_index, p_active, p_mainMap, p_tiles = []){


    if(p_active){

        this.i = p_tiles.length

        if(p_mainMap[p_x-1]){

            p_tiles[this.i] = widthFigure(p_x-1, 'x', p_tiles)
            this.i++
        }
        if(p_mainMap[p_x+1]){

            p_tiles[this.i] = widthFigure(p_x+1, 'x', p_tiles)
            this.i++
        }
        if(p_mainMap[p_y-1]){

            p_tiles[this.i] = widthFigure(p_y-1, 'y', p_tiles)
            this.i++
        }
        if(p_mainMap[p_y+1]){

            p_tiles[this.i] = widthFigure(p_y+1, 'y', p_tiles)
            this.i++
        }
   
    return {

        from_pass: p_tiles, 
        passed:    [`x:${p_x}, y:${p_y}`]

        }

    }
       



    function widthFigure(beam, type, p_tiles){

        if(type == 'y'){

            this.tile = p_mainMap[p_x][beam]
            this.x = p_x
            this.y = beam
        }

        if(type == 'x'){

            this.tile = p_mainMap[beam][p_y]
            this.x = beam
            this.y = p_y
        }

        this.coords = `x:${this.x}, y:${this.y}`

        if(this.tile == p_index && p_tiles.indexOf(this.coords) == -1) return this.coords


    }



}


как видно в коде нет никакого приравнивания.
  • Вопрос задан
  • 67 просмотров
Решения вопроса 1
@dGololobov
начинающий
outlineRectSize использует p_tiles, в который вы при втором вызове передаете tiles.from_pass
А потом внутри функции вы напрямую изменяете (дополняете) значения в p_tiles
Чтобы значения не менялись, надо внутри функции сделать копию массива. Например через JSON.parse()

const copyOfArray = JSON.parse(JSON.stringify(sourceArray))

Второй момент: внутри функции roundTile у вас происходит собственно повторный вызов outlineRectSize. А зачем? Если вы не хотите менять массив. А если все же хотите, тогда почему вызов не возвращается в переменную?

Вот пример кода для понимания того, что у вас происходит.
const f = (arr = []) => {
	arr.push(1)
        arr.push(2)
         return arr
}

const basicArr = f([]) // [1,2]

f(basicArr)

console.log(basicArr) // [1, 2, 1, 2]
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
@aby125
Я сильно в код не вникал, но думаю причина примерно в следующем - при первом вызове outlineRectSize, параметр p_tiles у вас пустой и сохраняется он в tiles.from_pass. При последующих вызовах вы его передаете последним параметром и он используется повторно.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы