查找所需的对象属性并将其替换为与对象数组有关的值

Find and replace required object properties with values with respect to array of objects

如果您觉得问题有点冗长,请见谅。 我有一个对象数组,结构如下:

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",
    }
];

我基本上必须根据传递的一些输入替换 ID 为 test2test3test4 的对象,其余对象应该保持不变。我写了一个 switch case,它接受三个值,然后计算,然后 returns 修改对象数组。

正在传递的应该进行修改的值是 abcdefghi

根据输入值基本上需要返回以下值 value1,value2 只是一些硬编码值

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",
    }
];

同理,

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",
    }
];

此外,

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"
    }
];

我试过的代码:

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;
}

您应该在更新值之前检查 ID。试试这个功能:

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;
}

类似的内容可能会有帮助:

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);
}

查看现场演示:
https://stackblitz.com/edit/js-x1pwqh

我已经根据您的需要更新了您的代码,并且附上了代码片段,只需在函数调用中根据需要更改值即可。 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;
}

回答数据被简化到隐藏您初衷的程度的问题总是具有挑战性。无论如何,这就是我如何分解问题的方法 -

// 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)

如何使用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);