Disculpa si sientes que la pregunta es un poco larga. Tengo una matriz de objetos en la siguiente estructura:

let arrObj = [{
        id: "test1",
        value1: "a1",
        value2: "b1",
    },
    {
        id: "test2",
        value1: "a2",
        value2: "b2",
    },
    {
        id: "test3",
        value1: "a3",
        value2: "b3",
    },
    {
        id: "test4",
        value1: "a4",
        value2: "b4",
    }
];

Básicamente, tengo que reemplazar el objeto con la identificación test2, test3, test4 en función de alguna entrada pasada, los objetos de descanso no deben ser tocados. He escrito un caso de cambio que toma tres valores y luego calcula y luego devuelve una matriz modificada de objetos.

Los valores que se están pasando sobre qué modificación debería ocurrir son abc, def, ghi.

Básicamente, los siguientes valores deben devolverse en función de los valores de entrada. El valor1, valor2 son solo algunos valores codificados

var res1 = updateValue(arrObj,"abc");
//result should be
 [{
        id: "test1",
        value1: "a1",
        value2: "b1",
    },
    {
        id: "test2",
        value1: "dsdsd",
        value2: "ghasgas",
    },
    {
        id: "test3",
        value1: "dsds",
        value2: "asasas",
    },
    {
        id: "test4",
        value1: "dsdsdsae",
        value2: "saheuwe",
    }
];

De manera similar,

var res1 = updateValue(arrObj,"def");
//result should be
[{
        id: "test1",
        value1: "a1",
        value2: "b1",
    },
    {
        id: "test2",
        value1: "dshds67",
        value2: "sdjsahdj1213",
    },
    {
        id: "test3",
        value1: "jdshdjh123",
        value2: "dkshdksj88",
    },
    {
        id: "test4",
        value1: "hjwhekjwq2123",
        value2: "sjhdj2323",
    }
];

Además

var res3 = updateValue(arrObj,"ghi");
//result should be
[{
        id: "test1",
        value1: "a1",
        value2: "b1",
    },
    {
        id: "test2",
        value1: "gahsddct21ew",
        value2: "gdsaedtsasa2re",
    },
    {
        id: "test3",
        value1: "gdsdssselectdsd",
        value2: "ghiasaselect3we",
    },
    {
        id: "test4",
        value1: "ghdsiselectdsdre",
        value2: "ghdsiselectr4"
    }
];

Código que he probado:

function updateValue(obj, value) {
    let defaultObj = {
        id: ""
    }
    var newObj = {};
    switch (value) {
        case "abc":
            newObj.value1 = "abcselect21"
            newObj.value2 = "abcselect22"
            break;

        case "def":
            newObj.value1 = "defselect21";
            newObj.value2 = "defselect22"
            break;

        case "ghi":
            newObj.value1 = "ghiselect21";
            newObj.value2 = "ghiselect22"
            break;
    }

    finalArr = [{
        ...defaultObj,
        ...newObj
    }];
    return finalArr;
}
0
li97 15 may. 2020 a las 17:51

5 respuestas

La mejor respuesta

Siempre es desafiante responder preguntas donde los datos se simplifican en un grado que oculta su intención original. De todos modos, así es como podría analizar el problema:

// generics
const identity = x => x

const update1 = (o = {}, [ k = "", t = identity ]) =>
  ({ ...o, [k]: t(o[k]) })
  
const update = (o = {}, patch = {}) =>
  Object.entries(patch).reduce(update1, o)

// specifics
const transform = ([ defaults, ...more ], str = "") =>
  [ defaults
  , ...more.map(item =>
      update(item, {
        value1: v => `${str}select${getId(v)}1`,
        value2: v => `${str}select${getId(v)}2`
      })
    )
  ]

const getId = (s = "") =>
  s.match(/\d+/) || 0

// test
const arrObj =
  [ {id:"test1",value1:"a1",value2:"b1"}
  , {id:"test2",value1:"a2",value2:"b2"}
  , {id:"test3",value1:"a3",value2:"b3"}
  , {id:"test4",value1:"a4",value2:"b4"}
  ]
  
const result =
  transform(arrObj, "xyz")
  
console.log(result)
1
Thank you 15 may. 2020 a las 15:40

¿Qué tal usar la función map:

var arrObj = [{ id: "test1", value1: "a1", value2: "b1", }, { id: "test2", value1: "a2", value2: "b2", }, { id: "test3", value1: "a3", value2: "b3", }, { id: "test4", value1: "a4", value2: "b4", }],
filters = ['test1', 'test2', 'test4'],
givenValue = 'abc';

result = arrObj.map(({id, ...rest },i)=>{
    if(filters.includes(id)) rest = { value1 : givenValue+'select2'+(i+1), value2 : givenValue+'select2'+(i+1) }
    return {id, ...rest};
});
console.log(result);
1
gorak 15 may. 2020 a las 15:43

Algo así podría ser útil:

var arrObj = [
  {
    id: "test1",
    value1: "a1",
    value2: "b1"
  },
  {
    id: "test2",
    value1: "a2",
    value2: "b2"
  },
  {
    id: "test3",
    value1: "a3",
    value2: "b3"
  },
  {
    id: "test4",
    value1: "a4",
    value2: "b4"
  }
];

var keyList = ["test2", "test3", "test4"];
mapObject(keyList, "abc");

function mapObject(filterList, param) {
  let newArray = arrObj
    .filter(item => filterList.findIndex(val => val == item.id) != -1)
    .map(function(currentValue, index) {
      currentValue.value1 = param + "select" + (index + 1).toString() + "1";
      currentValue.value2 = param + "select" + (index + 1).toString() + "2";

      return currentValue;
    })
    .concat(
      arrObj.filter(item => filterList.findIndex(val => val == item.id) == -1)
    );

  console.log(newArray);
}

Mira la demostración en vivo:
https://stackblitz.com/edit/js-x1pwqh

1
Luciano 15 may. 2020 a las 15:20

He actualizado su código de acuerdo con su deseo y el fragmento está adjunto, solo cambie los valores como desee en la función de llamada. var res1 = updateValue (arrObj, "def");

arrObj = [{ id: "test1", value1: "a1", value2: "b1", }, { id: "test2", value1: "select21", value2: "select22", }, { id: "test3", value1: "select31", value2: "select32", }, { id: "test4", value1: "select41", value2: "select42", } ];

var res1 = updateValue(arrObj,"def");

console.log(res1);

function updateValue(object, value) {
  var newObj = [];
  switch (value) {
      case "abc":
        for (var obj of object){
          if(obj.id != "test1"){
            obj.value1 = value + obj.value1;
            obj.value2 = value + obj.value2;
          }
          newObj.push(obj);
        }
          break;

      case "def":
        for (var obj of object){
          if(obj.id != "test1"){
            obj.value1 = value + obj.value1;
            obj.value2 = value + obj.value2;
          }
          newObj.push(obj);
        }
          break;

      case "ghi":
        for (var obj of object){
          if(obj.id != "test1"){
            obj.value1 = value + obj.value1;
            obj.value2 = value + obj.value2;
          }
          newObj.push(obj);
        }
          break;
  }
  
  return newObj;
}
1
Abdul Moeez 15 may. 2020 a las 15:36

Debe verificar los identificadores antes de actualizar los valores. Prueba esta función:

function updateValue(obj, value) {
  const finalArray = [];

  for (const item of obj) {
    const matches = item.id.match(/test([234])/);

    if (matches) {
      const testId = matches[1];
      finalArray.push({
        id: item.id,
        value1: `${value}select${testId}1`,
        value2: `${value}select${testId}2`,
      });
    } else {
      finalArray.push({ ...item });
    }
  }

  return finalArray;
}
1
Mehmet Baker 15 may. 2020 a las 15:26