어레이 요소를 제거하지 못했습니다.
몇 가지 제안을 필터링하는 페이지를 만들고 사용자가 가장 관심 있는 제안을 선택할 수 있도록 합니다.
이 화면을 [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"
}
]
for
loop을 사용하여 요소를 제거합니다.
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
'programing' 카테고리의 다른 글
Vuex에서 Vue 라우터 파라미터를 취득하는 방법 (0) | 2022.07.21 |
---|---|
vue를 사용하여 다른 페이지로 라우팅하고 해당 페이지의 제목과 텍스트를 표시하는 방법은 무엇입니까? (0) | 2022.07.21 |
다른 getter에 의존하는 Vuex getter 단위 테스트 (0) | 2022.07.21 |
Mockito를 사용하여 특정 메서드가 호출되지 않았는지 확인하는 방법 (0) | 2022.07.21 |
외부 javascript에서 Vue Component 범위 액세스 (0) | 2022.07.21 |