Basic question JavaScript: How to change an attribute of an object?

3

I came across a slightly different situation and I was in doubt.

I would like to know the following, I have an array of objects and in each object I have two attributes in it {valor: "texto", tamanho: "médio" } .

I would like to create a new array using the map for example and I would like that in my new array I would change the name of the attribute size to measure.

How do I create this new array but instead of the attributes of each object being (value and size) they are (value and measure)?

    
asked by anonymous 17.12.2017 / 08:09

3 answers

3

You can do this with .map as you mentioned. The code would look like this:

const lista = [{
  valor: "azul",
  tamanho: "grande"
}, {
  valor: "verde",
  tamanho: "pequeno"
}, {
  valor: "branco",
  tamanho: "medio"
}];

function usarMedida(arr) {
  return arr.map(obj => {
    return {
      valor: obj.valor,
      medida: obj.tamanho
    };
  });
}

console.log(usarMedida(lista));

If the object is more complex than the one you have in the question you can do this:

const lista = [{
  valor: "azul",
  tamanho: "grande"
}, {
  valor: "verde",
  tamanho: "pequeno"
}, {
  valor: "branco",
  tamanho: "medio"
}];

function usarMedida(arr) {
  return arr.map(entry => {
    return Object.keys(entry).reduce((obj, key) => {
      const value = entry[key]; // ler o valor
      if (key === 'tamanho') key = 'medida'; // mudar o nome da chave
      obj[key] = value;
      return obj;
    }, {});
  });
}

console.log(usarMedida(lista));
    
17.12.2017 / 10:42
1

To accomplish this "change," you can create a new attribute and remove the old one.

This way:

lista = [ {valor: "azul", tamanho: "grande"}, {valor: "verde", tamanho: "pequeno"}, {valor: "branco", tamanho: "medio"} ];

lista.forEach(function(value) {
    value.medida = value.tamanho;
    delete value.tamanho;
});

console.log( lista );
    
17.12.2017 / 10:31
0

You are on the right track, the map method is for you to access the indexes of an array and transform them into another value. In your case, the approach to doing so is quite simple:

const lista = [ {valor: "azul", tamanho: "grande"}, {valor: "verde", tamanho: "pequeno"}, {valor: "branco", tamanho: "medio"} ]
const mapped = lista.map(({valor, tamanho}) => ({ valor, medida: tamanho }))

If you want to encapsulate this solution for functional reuse:

// função que trasforma um determinado objeto
const sizeToMesure = ({valor, tamanho}) => ({ valor, medida: tamanho })

// curry function que recebe um mapper e retorna um map
const remapWith = mapper => src => src.map(mapper)

// cria um novo mapper a partir de uma function de transformação
const remapIn = remapWith(sizeToMesure)

// Ao executar este método em uma array, ele a trasforma em uma nova
remapIn(lista) // Array [{...},{...},...
    
17.12.2017 / 21:33