用对象数组的值来查找和替换所需的对象属性。

问题描述 投票:0回答:2

如果你觉得这个问题有点长,请原谅.我有一个对象数组,结构如下。

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来代替对象 test2, test3,test4 基于一些输入,其余的对象应该是不受影响的,我写了一个switch case,取三个值,然后计算,然后返回修改后的对象数组。我写了一个switch case,接受三个值,然后计算并返回修改后的对象数组。

被传递的值应该发生修改,这些值是 abc,def,ghi.

基本上需要根据输入的值返回以下值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;
}
javascript arrays ecmascript-6 ecmascript-5
2个回答
1
投票

回答数据简化到一定程度,以至于隐藏了你的初衷的问题,总是很有挑战性。不管怎么说,我可能会这样分解这个问题-------------------------------------------------------------。

// 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
投票

这样的东西可能会有帮助。

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.comeditjs-x1pwqh


1
投票

在更新值之前,你应该先检查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;
}

1
投票

我已经按照你的要求更新了你的代码,并附上了代码片段,只需在函数调用中按照你的要求更改值即可。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
投票

如何使用 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);
© www.soinside.com 2019 - 2024. All rights reserved.