Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/366.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中修改过的对象(类似于镜头)_Javascript_Ecmascript 6_Destructuring - Fatal编程技术网

返回JavaScript中修改过的对象(类似于镜头)

返回JavaScript中修改过的对象(类似于镜头),javascript,ecmascript-6,destructuring,Javascript,Ecmascript 6,Destructuring,与函数式语言中的Lens类似,JavaScript中是否有方法返回与原始对象相同的新对象,但某些元素已被修改 var myObject = { label: 'Table', options: ['legs'], params: { colour: 'red', feet: { colour: 'white', shape: 'round' } } } function newObject(obj) { // sought-a

与函数式语言中的Lens类似,JavaScript中是否有方法返回与原始对象相同的新对象,但某些元素已被修改

var myObject = {
  label: 'Table',
  options: ['legs'],
  params: {
    colour: 'red',
    feet: {
      colour: 'white',
      shape: 'round'
    }
  }
}

function newObject(obj) {
  // sought-after syntax here
  return obj({ params.colour = 'green', params.feet.shape = 'square' })
}

console.log(newObject(myObject))
{
  label: 'Table',
  options: ['legs'],
  params: {
    colour: 'green',
    feet: {
      colour: 'white',
      shape: 'square'
    }
  }
}

注意:
newObject()
返回一个新对象,不会影响任何形状或形式的原始对象。

不使用
对象即可轻松完成嵌套。分配

Object.assign({}, obj, { label: "New One" })
或使用对象展开:

{ ...obj, label: "New One" }
要支持嵌套对象/数组,必须手动递归合并对象:

 function merge(target, changes) {
   const result = {};

   for(const [key, value] of Object.entries(target).concat(Object.entries(changes))) {
     if(Array.isArray(value)) {
       // TODO
     } else if(typeof value === "object") {
       result[key] = merge(result[key] || {}, value);
     } else {
       result[key] = value;
     }
   }

   return result;
}

您可以尝试使用扩展语法

var myObject={
标签:'表',
选项:[“腿”],
参数:{
颜色:“红色”,
脚:{
颜色:'白色',
形状:“圆形”
}
}
}
函数newObject(obj){
//这里流行的语法
返回({…obj,params:{…obj.params,颜色:“绿色”,英尺:{…obj.params.feet,形状:“正方形”}})
}

console.log(newObject(myObject))
另一种方法是:

let newObj = JSON.parse(JSON.stringify(oldObj))

它是一个普通的物体还是一个复杂的物体?另外,它是否有任何分配给它的函数,或者它只是原语、数组和其他对象?JavaScript中没有对其的直接支持,但它当然可以实现代码来完成类似的事情。这将是一个仅由原语组成的对象,数组和其他对象Scheck immer或ramda或immutableJavaScript的功能足够强大,您可以编写自己的lents+1以使用扩展语法。作为旁注,当使用大量参数时,这种方法有一个警告,可能会达到Javascript引擎的限制(这看起来取决于实现,所以从大约10000个参数到65535个参数)。看到了,感觉就像是原生镜片对我的支持