Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/375.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 在ES6中修改选定的对象值_Javascript_Ecmascript 6 - Fatal编程技术网

Javascript 在ES6中修改选定的对象值

Javascript 在ES6中修改选定的对象值,javascript,ecmascript-6,Javascript,Ecmascript 6,我有一个如下所示的数组: let arr = [{ x: 2, y: 2, z: 2, w: 2, name: 'John Doe', occupation: 'student' }] 数组中的每个对象都有大约30个字段。我有一些数字类型的字段,我想修改,比如: arr.forEach(data => { data.x += 5 data.y += 5 data.z += 5 data.w += 5 return data }) 这是可

我有一个如下所示的数组:

let arr = [{
  x: 2,
  y: 2,
  z: 2,
  w: 2,
  name: 'John Doe',
  occupation: 'student'
}]
数组中的每个对象都有大约30个字段。我有一些数字类型的字段,我想修改,比如:

arr.forEach(data => {
  data.x += 5
  data.y += 5
  data.z += 5
  data.w += 5
  
  return data
})
这是可行的,但我在对象中有大约10个参数(这个数字将来可能会增加),我将添加5个,我不喜欢它的外观。我想知道是否有一个较短的方法来做这件事?
而且,我想返回整个对象,而不仅仅是我修改的参数。

您可以创建一个函数,该函数接受您想要更改的属性数组和您想要添加的值,并使用
map
reduce
方法返回新的对象数组

arr.forEach(data => {
    Object.keys(data).forEach(key => {
        if (typeof data[key] === "number") {
            data[key] += 5;
        }
    })
    return data;
});
让arr=[{
x:2,
y:2,
z:2,
w:2,
姓名:“约翰·多伊”,
职业:学生
}]
常量添加=(arr、道具、值)=>
arr.map(o=>props.reduce((r,e)=>{
r[e]+=值
返回r;
},{…o})
常量结果=添加(arr,['x','y','z','w'],5)

console.log(result)
您可以创建一个函数,该函数接受要更改的属性数组和要添加的值,并使用
map
reduce
方法返回新的对象数组

让arr=[{
x:2,
y:2,
z:2,
w:2,
姓名:“约翰·多伊”,
职业:学生
}]
常量添加=(arr、道具、值)=>
arr.map(o=>props.reduce((r,e)=>{
r[e]+=值
返回r;
},{…o})
常量结果=添加(arr,['x','y','z','w'],5)

console.log(result)
如果可能的话,我建议不要将用于突变的键与用于在一个对象中持久化的键混合使用:

const arr=[{
姓名:“约翰·多伊”,
职业:“学生”,
协调:{
x:2,
y:2,
z:2,
w:2,
},
}];
…然后简单地:

for(arr的const项){
用于(项目协调中的常数协调){
项目.坐标[coord]+=5;
}
}
…或:

arr.forEach((项目)=>{
Object.key(item.coords).forEach((coord)=>{
项目.坐标[coord]+=5;
});
});

如果这是不可能的(例如,如果您没有定义项目的形状),则必须有一个要更改的属性键的附加列表:

常量键=[“x”、“y”、“z”、“w”]; 用于(arr的施工项目){ for(键的常数键){ 项目[键]+=5; } } …反之亦然,不发生变异的密钥列表(性能更差的解决方案):

const key=[“名称”、“职业”];
用于(arr的施工项目){
用于(常量输入项){
如果(!键。包括(键)){
项目[键]+=5;
}
}
}

但请记住,这种方法并不完全可行。

如果可能的话,我建议不要将用于突变的键与用于在一个对象中持久化的键混合使用:

const arr=[{
姓名:“约翰·多伊”,
职业:“学生”,
协调:{
x:2,
y:2,
z:2,
w:2,
},
}];
…然后简单地:

for(arr的const项){
用于(项目协调中的常数协调){
项目.坐标[coord]+=5;
}
}
…或:

arr.forEach((项目)=>{
Object.key(item.coords).forEach((coord)=>{
项目.坐标[coord]+=5;
});
});

如果这是不可能的(例如,如果您没有定义项目的形状),则必须有一个要更改的属性键的附加列表:

常量键=[“x”、“y”、“z”、“w”]; 用于(arr的施工项目){ for(键的常数键){ 项目[键]+=5; } } …反之亦然,不发生变异的密钥列表(性能更差的解决方案):

const key=[“名称”、“职业”];
用于(arr的施工项目){
用于(常量输入项){
如果(!键。包括(键)){
项目[键]+=5;
}
}
}

但是请记住,这种方法并不完全正确。

可以这样做的一种方法是编写一个通用的
map
函数-

const map=(o,f)=>
数组。isArray(o)
? o、 地图(f)
:Object.fromEntries(Object.entries(o.map)([k,v])=>[k,f(v)])
常量数据=
{x:2,y:2,z:2,w:2,姓名:'John Doe',职业:'student'}
常数结果=
地图(数据,v=>数字(v)==v?v+5:v)

log(result)
实现这一点的一种方法是编写一个通用的
map
函数-

const map=(o,f)=>
数组。isArray(o)
? o、 地图(f)
:Object.fromEntries(Object.entries(o.map)([k,v])=>[k,f(v)])
常量数据=
{x:2,y:2,z:2,w:2,姓名:'John Doe',职业:'student'}
常数结果=
地图(数据,v=>数字(v)==v?v+5:v)
console.log(结果)