Exclude element from a dynamic object array

Asked

Viewed 78 times

-2

I need to delete a column from a dynamic object array.

Example:

export interface ObjetoTeste {
  primeiraColuna: string;
  segundaColuna: string;
}

let teste: Array<ObjetoTeste> = [
  {
    primeiraColuna: 'teste1',
    segundaColuna: 'teste1'
  },
  {
    primeiraColuna: 'teste2',
    segundaColuna: 'teste2'
  }
  {
    primeiraColuna: 'teste2',
    segundaColuna: 'teste2'
  }
]

//O header definirá qual coluna será excluída com base no valor XXX
var header: ObjetoTeste = {
  primeiraColuna: 'Juninho',
  segundaColuna: 'XXX',
}
 
// Com base no header, não terá mais a segundaColuna
var semSegundaColuna: Array<ObjetoTeste> = [
  {
    primeiraColuna: 'teste1',
  },
  {
    primeiraColuna: 'teste2',
  }
  {
    primeiraColuna: 'teste2',
  }
];

The header is the object that defines who will be deleted based on the XXX value received in the column.

Other Example:

export interface ObjetoTeste2 {
   primeiraColuna: string;
   segundaColuna: string;
   terceiraColuna: string;
}

let header: ObjetoTeste2 = {
  primeiraColuna: 'XXX',
  segundaColuna: 'Teste',
  terceiraColuna: 'XXX'
}

//Primeiro irá receber os valores inteiros para então ser tratatos
let teste2: Array<ObjetoTeste2> = [
  {
    primeiraColuna: 'teste1',
    segundaColuna: 'teste1',
    terceiraColuna: 'teste1'
  },
  {
    primeiraColuna: 'teste2',
    segundaColuna: 'teste2',
    terceiraColuna: 'teste2'
  }
]

//resultado do tratamento do objeto com base nos valores do header
let resultado: Array<ObjetoTeste2> = [
      {
        segundaColuna: 'teste1',
      },
      {
        segundaColuna: 'teste2',
      }
    ];
  • 1

    "Based on the header, you will no longer have the second" and as the header defined that it should not have the second column? has no value that says to remove, need to clarify the criterion

2 answers

1

do not know what is the context of your need to remove the columns by the value "XXX", this would only be worth if this value "XXX" was some return of an API, but let’s separate your problem in two.

  1. first recover the list of columns to remove.
  2. remove the column from the object list

I will present two solutions one with delete and another without, delete has a problem that it ends up mutating the object and for many times this can generate problems, the ideal would be to create a method to clone each object of the list, but I will not include in this solution since it is not pertinent the question.

Solution without delete:

First we will recover the list of columns to remove, so it will be clearer for future maintenance:

/*
 * Primeiro vamos recuperar a lista de colunas a remover, 
 * assim ficará mais claro para futuras manutenções:
 */

var header = {
  primeiraColuna: 'XXX',
  segundaColuna: 'Teste',
  terceiraColuna: 'XXX'
}

var colunasParaRemover = Object.entries(header).filter(item => item[1] === "XXX").map(n => n[0]);
console.log(colunasParaRemover);


/*
 * Segundo vamos criar uma função para fazer a remoção, 
 * separando a lógica você obtém algo de fácil manutenção e funções 
 * mais genéricas para utilização no sistema, primeiro vamos criar 
 * uma função que  retorna a lista com as colunas selecionadas
 */

var teste2 = [
  {
    primeiraColuna: 'teste1',
    segundaColuna: 'teste1',
    terceiraColuna: 'teste1'
  },
  {
    primeiraColuna: 'teste2',
    segundaColuna: 'teste2',
    terceiraColuna: 'teste2'
  }
]

var removeColunadaLista = (listaObjetos, colunasRemover) => {
  colunas = Object.keys(listaObjetos[0]).filter(n => ! colunasRemover.includes(n)); // invetemos montamos uma lista somente das Keys que queremos;
    return listaObjetos.map(objeto => Object.fromEntries(colunas.map(k => [k, objeto[k]]))); // retorna a lista sem a coluna desejada
}

console.log(teste2);
console.log(removeColunadaLista(teste2, colunasParaRemover)); // retorna uma lista de objetos formatado
console.log(teste2); // não altera o a lista principal.

Solution With Delete:

Beware of this solution because it changes the Object itself, remembering that the array stores the object reference

var o = {opa: "x", neh: "y", vixi: "z"};
var o2 = {opa: "a", neh: "b", vixi: "c"};
var os = [o, o2];
var dc = ["opa", "vixi"];

os.forEach(n => dc.forEach(c => delete n[c]));

console.log(o); // {neh: "y"}
console.log(o2); // {neh: "b"}
console.log(os); // [{neh: "y"},{neh: "b"} ];

  • 2

    The problem of using delete is that, in addition to modifying the object (which may be a problem in some situations), it creates holes in the array, which may actually be a problem in the vast majority of cases. Console test: let arr = [1, 2, 3]; delete arr[1]; arr;.

-5


I was able to solve this way, where test is the array variable and header the filter object:

let teste3 = teste.map((data) => {
    Object.keys(header).forEach((headerData) => {
      if (header[headerData] == "XXX") {
        delete data[headerData];
      }
    });
});

Browser other questions tagged

You are not signed in. Login or sign up in order to post.