【问题标题】:How to assign in nested object using Object.assign()?如何使用 Object.assign() 在嵌套对象中赋值?
【发布时间】:2017-02-19 12:26:00
【问题描述】:

我的主要对象如下所示:

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 reducer。

【问题讨论】:

  • 所以基本上你需要从 obj 获取一个副本,其中包含 Puppies 中的一个新项目,索引为零,而不改变原始对象,对吧?

标签: javascript object


【解决方案1】:

您可以分配外部对象并将索引0 处的新内容分配给数组,而无需改变原始obj

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

console.log(Object.assign({}, obj, { data: { Puppies: Object.assign([], obj.data.Puppies, { 0: list }) } }));
console.log(obj);

Puppies 的内容相同。

const list = ['foo', 'bar'];
const obj = { data: { Puppies: ['bar', 42], Kittens: [] } };

console.log(Object.assign({}, obj, { data: { Puppies: Object.assign([], obj.data.Puppies, { 0: list }) } }));
console.log(obj);

【讨论】:

  • 如果小狗和小猫可能会发生变化怎么办?可变小猫怎么样?
  • 那么你可以使用Kitten的模式以及{ data: { Kitten: Object.assign([], obj.data.Kitten, { 0: data }) } }
  • 不,我的意思是你有硬编码的小狗和小猫。如果我们不知道它是哪一个怎么办?
  • 如果你不知道你需要什么数组来处理一些新数据,无论如何你不能分配它。对于深层副本,您可以使用其他一些技术。
【解决方案2】:

没有突变的ES6方式:

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

const data = Object.assign({}, obj.data, {
                 Puppies: [...obj.data.Puppies, 'newValue']
             });    
const newObject = Object.assign({}, obj, {data});
console.log(newObject);

【讨论】:

    【解决方案3】:

    您可以尝试使用 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))
    

    Here是代码排斥

    【讨论】:

    • ?,,你被 ramda 迷住了。
    • 没有错,只是编辑别人的答案并注入这个可怜的库
    【解决方案4】:

    用一个新数组替换 Puppies,list 作为元素 0,其余的 Puppies 从元素 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);
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-11-03
      • 2018-03-27
      • 1970-01-01
      • 2017-04-20
      • 2017-03-18
      • 1970-01-01
      • 2021-10-01
      • 1970-01-01
      相关资源
      最近更新 更多