programing

어레이 요소를 제거하지 못했습니다.

itsource 2022. 7. 21. 20:24
반응형

어레이 요소를 제거하지 못했습니다.

몇 가지 제안을 필터링하는 페이지를 만들고 사용자가 가장 관심 있는 제안을 선택할 수 있도록 합니다.

이 화면을 [Top Rated], [Newest] 및 [My Polites]의 3개의 탭으로 분할하고 있습니다.화면을 시작할 때 데이터베이스 내에서 모든 제안을 가져오는 콜을 발신할 때 다음을 수행합니다.axios

axios
      .get("/sugestoes/carregar/xxxx")
      .then(res => {
        this.sugestoesGeral = res.data.sugestoes

        for(var i=0; i < this.sugestoesGeral.length; i++){
          if(this.sugestoesGeral[i].meu_voto === "S"){
            this.meusVotos.splice(1, 0, this.sugestoesGeral[i])
          }
        }

        this.maisVotados     = [...this.sugestoesGeral]
        this.maisNovos       = [...this.sugestoesGeral] 
        this.ordernarArrVotos(this.maisVotados)
      })
      .catch(err => {
        console.log(err);
      });

이렇게 하면 데이터베이스의 첫 번째 호출부터3개의 어레이를 시작할 수 있습니다.

사용자가 제안에 대해 투표할 때 각 탭 [Top Rated], [Newest] 및 [My Polites]에 따라 어레이 순서를 변경합니다.

this.moreVoted그리고.this.moreNew어레이는 문제없이 재주문됩니다.그러나 어레이에 대해 다른 작업을 수행해야 합니다.this.meusVotes단순히 재주문하는 것 외에 투표가 삭제되었는지 확인해야 합니다.이 작업을 완료했다면 어레이에서 이 위치를 삭제한 후 사용자에게 다시 보여줘야 합니다.

어레이에서 위치를 삭제하려면 다음 절차를 따릅니다.

for(var i=0; i < this.sugestoesGeral.length; i++){
        if(this.sugestoesGeral[i].meu_voto === 'N'){
          var length = this.meusVotos.length
          for(var x=0; x < length; x++){
            if(this.meusVotos[x].id_sugestao === this.sugestoesGeral[i].id_sugestao){
              this.meusVotos.splice(x, 1)
            }
          }
        }
      }

console.log(this.meusVotos)

그러나 이렇게 해도 효과가 없고 어레이에서 위치가 삭제되지 않습니다.테스트를 위해 다음과 같이 했습니다.

this.meusVotos.shift()
console.log(this.meusVotos)

그러나 결과는 동일하며 어레이에서 요소가 제거되지 않습니다.가장 궁금한 점은 이 어레이의 복사본을 생성하여browser console에러 없이 동작합니다.다음 예시는 정상적으로 동작합니다.console:

어레이:

sugestoesGeral = [
                    {
                        status_atual: "Em votação",
                        categoria: "Parâmetros",
                        quantidade_votos: 1,
                        meu_voto: "S",
                        id_sugestao: 16,
                        titulo: "Alerta de Valor Excedente por Cliente no MDF-e",
                        data_criacao: "29/01/2020",
                        descricao_resumida: "Alerta de Valor Excedente por Cliente no MDF-e",
                        motivo_rejeicao: "",
                        data_rejeicao: "",
                        data_implementacao: "",
                        data_previsao_execucao: "",
                        data_encerramento_votacao: "",
                        cor: "#b8dbff"
                    },
                    {
                        status_atual: "Em votação",
                        categoria: "Despesas",
                        quantidade_votos: 1,
                        meu_voto: "N",
                        id_sugestao: 7,
                        titulo: "Nova coluna Controle de Despesas",
                        data_criacao: "28/01/2020",
                        descricao_resumida: "Checar vínculo financeiro da Despesa quando vinculada a uma Nota com Financeiro lançado",
                        motivo_rejeicao: "",
                        data_rejeicao: "",
                        data_implementacao: "",
                        data_previsao_execucao: "",
                        data_encerramento_votacao: "",
                        cor: "#b8dbff"
                    }
                ]

meusVotos = [
                    {
                        status_atual: "Em votação",
                        categoria: "Parâmetros",
                        quantidade_votos: 1,
                        meu_voto: "S",
                        id_sugestao: 16,
                        titulo: "Alerta de Valor Excedente por Cliente no MDF-e",
                        data_criacao: "29/01/2020",
                        descricao_resumida: "Alerta de Valor Excedente por Cliente no MDF-e",
                        motivo_rejeicao: "",
                        data_rejeicao: "",
                        data_implementacao: "",
                        data_previsao_execucao: "",
                        data_encerramento_votacao: "",
                        cor: "#b8dbff"
                    },
                    {
                        status_atual: "Em votação",
                        categoria: "Despesas",
                        quantidade_votos: 1,
                        meu_voto: "N",
                        id_sugestao: 7,
                        titulo: "Nova coluna Controle de Despesas",
                        data_criacao: "28/01/2020",
                        descricao_resumida: "Checar vínculo financeiro da Despesa quando vinculada a uma Nota com Financeiro lançado",
                        motivo_rejeicao: "",
                        data_rejeicao: "",
                        data_implementacao: "",
                        data_previsao_execucao: "",
                        data_encerramento_votacao: "",
                        cor: "#b8dbff"
                    }
                ]

forloop을 사용하여 요소를 제거합니다.

for(var i=0; i < this.sugestoesGeral.length; i++){
        if(this.sugestoesGeral[i].meu_voto === 'N'){
          var length = this.meusVotos.length
          for(var x=0; x < length; x++){
            if(this.meusVotos[x].id_sugestao === this.sugestoesGeral[i].id_sugestao){
              this.meusVotos.splice(x, 1)
            }
          }
        }
      }

어떤 도움이라도 환영합니다

이러한 경우 각각에 대해 계산된 속성을 작성할 것을 권장합니다.this.moreVoted,this.moreNew그리고.this.meusVotes.

이쪽입니다sugestoesGeral이러한 속성의 SSOT가 됩니다.

computed: {
  maisVotados() {
    return this.sugestoesGeral.sort((a, b) => {
      if (a.quantidade_votos > b.quantidate_votos) return 1;
      else if (a.quantidate_votos < b.quantidade_votos) return -1;
      return 0;
    })
  },
  maisNovos() {
    return this.sugestoesGeral.sort((a, b) => {
      let dateParts = a.data_criacao.split("/");
      const dateA = new Date(dateParts[2], dateParts[1] - 1, dateParts[0]);
      dateParts = b.data_criacao.split("/");
      const dateB = new Date(dateParts[2], dateParts[1] - 1, dateParts[0]);
      if (dateA > dateB) return 1;
      else if (dateA < dateB) return -1;
      return 0;
    });
  }
},
methods: {
  reordenarSugestoes() {
    this.meusVotos = this.sugestoesGeral.filter((sugestao) => sugestao.meu_voto === 'S');
  }
}

해라

for(var i=0; i < this.sugestoesGeral.length; i++){
   if(this.sugestoesGeral[i].meu_voto === 'N'){
      for(var x=0; x < this.meusVotos.length; x++){
         if(this.meusVotos[x].id_sugestao === this.sugestoesGeral[i].id_sugestao){
             this.meusVotos.splice(x, 1);
            }
          }
        }
      }

어떻게 지내는지 봐야지

앞서 설명한 바와 같이.splice()어레이에서 요소를 삭제하는 적절한 방법입니다.x의 값이 배열 길이를 초과하지 않는 수치인지 확인하는 것이 좋습니다.변경이 필요할 수 있습니다.x < length로.x < this.meusVotos.length제가 알기로는length이 수정되어 새로운 길이 값을 얻지 않고 어레이를 수정했습니다.this.meusVotos.length는 라이브 체크 변수이며 길이는 스태틱입니다.배열을 변경해도 동일하게 유지되므로 어느 시점에서 x가 경계를 벗어납니다.

언급URL : https://stackoverflow.com/questions/60076657/failed-to-remove-array-element

반응형