查找所需的对象属性并将其替换为与对象数组有关的值
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 为 test2
、test3
、test4
的对象,其余对象应该保持不变。我写了一个 switch case,它接受三个值,然后计算,然后 returns 修改对象数组。
正在传递的应该进行修改的值是 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;
}
您应该在更新值之前检查 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);
}
我已经根据您的需要更新了您的代码,并且附上了代码片段,只需在函数调用中根据需要更改值即可。 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);
如果您觉得问题有点冗长,请见谅。 我有一个对象数组,结构如下:
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,它接受三个值,然后计算,然后 returns 修改对象数组。
正在传递的应该进行修改的值是 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;
}
您应该在更新值之前检查 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);
}
我已经根据您的需要更新了您的代码,并且附上了代码片段,只需在函数调用中根据需要更改值即可。 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);