Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/457.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/amazon-s3/2.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 如何使用object.assign()在嵌套对象中赋值?_Javascript_Object - Fatal编程技术网

Javascript 如何使用object.assign()在嵌套对象中赋值?

Javascript 如何使用object.assign()在嵌套对象中赋值?,javascript,object,Javascript,Object,我的主要对象如下所示: const obj = { data: { 'Puppies' : [], 'Kittens': [] } }; 我想给data.Puppies[0]中的数据字段赋值 当我尝试使用Object.assign()执行此操作时,我得到一个错误: Unexpected token, expected , (83:12) 81 | 82 | return Object.assign({}, obj,

我的主要对象如下所示:

const obj = {

    data: {
        'Puppies' : [],
        'Kittens': []
    }
};
我想给data.Puppies[0]中的数据字段赋值

当我尝试使用Object.assign()执行此操作时,我得到一个错误:

    Unexpected token, expected , (83:12)

  81 | 
  82 |     return Object.assign({}, obj, {
> 83 |         data.Puppies[0]: list
     |             ^
  84 |     });
  85 | }
  86 | 
我不知道怎样才能完成我的任务。
我需要使用Object.assign(),因为我需要返回一个新对象,而不是原始对象。我这样做是因为ReactJS中的Redux还原剂。

ES6没有突变的方式:

const obj={
数据:{
“小狗”:[],
‘小猫’:[]
}
};
const data=Object.assign({},obj.data{
小狗:[…obj.data.Puppies,'newValue']
});    
const newObject=Object.assign({},obj,{data});

console.log(newObject)
您可以分配外部对象,并将索引
0
处的新内容分配给数组,而无需修改原始的
obj

const list=['foo','bar'];
const obj={data:{小狗:[],小猫:[]};
log(Object.assign({},obj,{data:{Puppies:Object.assign([],obj.data.Puppies,{0:list}}}));

控制台日志(obj)
用一个新数组替换幼犬,将
列表
作为元素0,其余幼犬从元素1开始,这样可以有效地替换元素0

var obj = { data: { 'Puppies': [], 'Kittens': [] } };
var list = [ 'a', 'b' ];

var n = Object.assign({}, obj, {
  data: Object.assign({}, obj.data, {
    Puppies: [ list ].concat(obj.data.Puppies.slice(1))
  })
});

console.log(obj);
console.log(n);

您可以尝试使用Ramdajs镜头来实现这一点

const obj = {
    data: {
        'Puppies' : [],
        'Kittens': []
    }
};

const list = [1,2,3,4];
const xlens = R.lensPath(['data', 'Puppies'])
console.log(R.set(xlens, list, obj))

代码排斥

所以基本上我们需要从obj获得一个副本,在索引0处的
Puppies
中有一个新项目,而不改变原始对象,对吗?如果小狗和小猫可能会改变呢?一只可变的小猫怎么样?那么你也可以使用
Kitten
的模式
{data:{Kitten:Object.assign([],obj.data.Kitten,{0:data}}}}}
不,我的意思是你有硬编码的小狗和小猫。如果我们不知道它是哪一个呢?如果你不知道你需要什么数组来处理一些新数据,你无论如何也不能分配它。对于深度复制,您可以使用其他一些技术。没有错,只是编辑其他人的答案并注入这个糟糕的库